解题思路
先对原矩阵进行转置(关于对角线对称),然后在对每一行元素进行前后翻转。
public void rotate(int[][] matrix) {
int n = matrix.length;
//翻转
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
//前后调换位置
for (int i = 0; i < n; i++) {
for (int j = 0; j < n/2; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[i][n-j-1];
matrix[i][n-j-1] = temp;
}
}
}
使用分治法,将矩阵分为4块,然后进行移动。(对第一块中所有元素都移动到该到的位置即可完成图像翻转)
- (1,0)——>(0,2)——>(2,3)——>(3,1)
- 规律就是下一个位置的行是上一个位置的列,下一个位置的列+上一个位置的行=n-1
public void rotate1(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < (n+1)/2; i++) {
for (int j = 0; j < n/2; j++) {
int[] temp = new int[4];
int row = i;
int col = j;
for (int k = 0; k < 4; k++) {
temp[k] = matrix[row][col];
int temp1 = row;
row = col;
col = n - 1 -temp1;
}
for (int k = 0; k < 4; k++) {
//用上一个值,替换当前的值
matrix[row][col] = temp[(k+3)%4];
int temp2 = row;
row = col;
col = n - 1 -temp2;
}
}
}
}
因为元素的位置变化已经知道,所以直接可以进行位置的变化。
public void rotate2(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < (n+1)/2; i++) {
for (int j = 0; j < n/2; j++) {
int temp = 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;
}
}
}
块号 | 位置坐标 |
---|---|
1 | (i,j) |
2 | (j,n-i-1) |
3 | (n-i-1,n-j-1) |
4 | (n-j-1,i) |