目录
每日一句
作者简介
『LeetCode|每日一题』旋转矩阵
1.每日一题
2.解题思路(新数组法)
2.1 思路分析
2.2 核心代码
2.3 完整代码
2.4 运行情况
3.解题思路(原地旋转)
3.1 思路分析
3.2 核心代码
3.3 完整代码
3.4 运行结果
把烦心事都抛掉,腾出地方让鲜花盛开
个人主页:XiaoChen_Android
学习专栏:力扣专栏
发布日期:2022/9/6
原文链接--->点我
首先看到这个题,我就在草稿纸上自己一步一步去旋转,最后试了几次之后也发现了一个规律
S1:首先第一步定义一个新的矩阵,用来存储旋转后的数组;
S2:然后一行一行看,首先第一行就反转到了最后一列,第二行就反转到了倒数第二列,以此类推;
S3:新建的数组都初始化之后,就得到了我们想要的反转数组;
S4:最后把反转数组覆盖原数组即可
此方法的时间和空间复杂度都是O(),很显然不是最优的方法
for(int i = 0 ; i < row ; i++){
for(int j = 0 ; j < col ; j++){
nums[j][col - i - 1] = matrix[i][j];
}
}
for(int i = 0 ; i < row ; i++){
for(int j = 0 ; j < col ; j++){
matrix[i][j] = nums[i][j];
}
}
class Solution {
public void rotate(int[][] matrix) {
int row = matrix.length;
int col = matrix[0].length;
int[][] nums = new int[row][col];
for(int i = 0 ; i < row ; i++){
for(int j = 0 ; j < col ; j++){
nums[j][col - i - 1] = matrix[i][j];
}
}
for(int i = 0 ; i < row ; i++){
for(int j = 0 ; j < col ; j++){
matrix[i][j] = nums[i][j];
}
}
}
}
首先旋转的思路和上一个方法相同,但是此方法是在原数组上旋转
有的读者会有疑问,原地旋转岂不是把后面的数据覆盖了吗,其实解决这个问题很简单,我们定义一个flag来存储之前的值,这样就不会被覆盖了
最关键的地方就在于旋转之后的值会去哪里呢?
S1:flag = matrix[col][n - row - 1],matrix[col][n - row - 1] = matrix[row][col];
S2:matrix[col][n - row - 1]旋转之后去哪了呢?我们还是使用关键的等式,row = col,col = n - row - 1,代入之后可以得到matrix[n − row − 1][n − col − 1] = matrix[col][n − row − 1];
S3:同样的,直接覆盖还是会覆盖掉之前的值,因此还是需要一个临时变量来存储该值,不过这次不需要重新定义,直接用上一个就好了,此时:flag = matrix[n − row − 1][n − col − 1],matrix[n − row − 1][n − col − 1] = matrix[col][n − row − 1],matrix[col][n − row − 1] = matrix[row][col];
S4:再经过同样的步骤,matrix[n − row − 1][n − col − 1]旋转之后会去哪呢?此时可以通过等式row = n - row - 1,col = n - col - 1带入得到matrix[n − col − 1][row]=matrix[n − row − 1][n − col − 1],同样用临时变量来存储之前的值,flag = matrix[n − col − 1][row],matrix[n − col − 1][row] = matrix[n − row − 1][n − col − 1],matrix[n − row − 1][n − col − 1] = matrix[col][n − row − 1],matrix[col][n − row − 1] = matrix[row][col];
S5:那么此时matrix[n − col − 1][row]旋转之后回到了哪里呢?通过等式row = n - col - 1,col = row,代入可得matrix[row][col]=matrix[n−col−1][row],此时同样也是用一个临时变量来存储之前的值,并且此时回到了最初的起点,也就可以发现
matrix[row][col]、matrix[col][n - row - 1]、matrix[n − row − 1][n − col − 1]、matrix[n − col − 1][row]四项处于一个循环之中,每一项旋转之后的位置就是下一项的位置,因此用一个临时变量来完成四个位置的交换
注意:当矩阵的长度为奇数时,那么最中间的那个数是不用旋转的,所以为了保证不重复不遗漏,奇数的时候我们需要枚举( - 1) / 4个位置
for (int i = 0; i < n / 2; ++i) {
for (int j = 0; j < (n + 1) / 2; ++j) {
int flag = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = temp;
}
}
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < n / 2; ++i) {
for (int j = 0; j < (n + 1) / 2; ++j) {
int flag = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = flag;
}
}
}
}
类似题目推荐:
1.数据结构基础
2.算法专项练习
3.剑指offer专项练习
4.推荐一个学习网站:LeetCode,算法的提升在于日积月累,只有每天练习才能保持良好的状态
如果文章对各位大佬有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!