题意:
将一个n*n的二维矩阵顺时针旋转90度
分析:
数组的核心就在角标,我们要去研究这样的旋转到底是怎么旋转的?
举例子研究发现规律:
【i, j】 => 【j, n-1-i】
接下来面临的第二个问题就是怎样才能不冲撞:
由于每个点都可以与其余三个点联系起来,就是点1旋转到点2,点2旋转到点3,点3旋转到点4,点4旋转到点1!
发现第一行遍历第一个到倒数第二个,第二行从第二个遍历到倒数第三个....直到中间那一行停止。就可以实现不冲撞。
如图:(下图是矩阵的1/4, 遍历它们,每一个点都经历【i, j】 => 【j, n-1-i】四次,又回到原来的点)
**********
********
******
*****
***
*
代码中的p1,p2,p3,p4比较乱。
public class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
int p1,p2,p3,p4;
for(int i=0; i<n/2; i++){
for(int j=i; j<n-1-i; j++){
p1 = matrix[i][j]; //记录第一个点
p2 = matrix[j][n-1-i]; //记录第二个点
matrix[j][n-1-i] = p1;
p3 = matrix[n-1-i][n-1-j]; //记录第三个点
matrix[n-1-i][n-1-j] = p2;
p4 = matrix[n-1-j][i]; //记录第四个点
matrix[n-1-j][i] = p3;
matrix[i][j] = p4;
}
}
}
}
知道了四个点是什么之后,优化代码书写风格:
public class Solution {
public void rotate(int[][] matrix) {
int n=matrix.length;
for (int i=0; i<n/2; i++)
for (int j=i; j<n-i-1; j++) {
int p = matrix[i][j];
matrix[i][j] = matrix[n-1-j][i];
matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
matrix[j][n-1-i] = p;
}
}
}