🐕给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。
请不要 使用另一个矩阵来旋转图像
提示:
- matrix.length == n
- matrix[i].length == n
- 1 <= n <= 20
- -1000 <= matrix[i][j] <= 1000
🐱思路:一
先上下交换,再对角线两侧交换
上代码
public static void rotate(int[][] matrix) {
int len = matrix.length;
//上下交换
int lenIndex = len -1;
for(int col = 0 ; col < len/2 ; col ++) {
for(int i = 0; i < len; i++) {
matrix[col][i] ^= matrix[lenIndex][i];
matrix[lenIndex][i] ^= matrix[col][i];
matrix[col][i] ^= matrix[lenIndex][i];
}
lenIndex--;
}
//对角线两侧交换
int lineIndex = 0;
for(;lineIndex < len; lineIndex ++) {
for(int col = lineIndex+ 1; col < len; col ++) {
matrix[lineIndex][col] ^= matrix[col][lineIndex];
matrix[col][lineIndex] ^= matrix[lineIndex][col];
matrix[lineIndex][col] ^= matrix[col][lineIndex];
}
}
}
🐖思路:二
因为是对称的,循环替换即可
上代码
public static void rotate_V2(int[][] matrix) {
int len = matrix.length;
//因为是对称的,只需要计算循环前半行即可
for(int i = 0; i < len / 2; i ++) {
for(int j = i; j < len - i - 1; j++) {
int temp = matrix[i][j];
int m = len - j - 1;
int n = len - i - 1;
matrix[i][j] = matrix[m][i];
matrix[m][i] = matrix[n][m];
matrix[n][m] = matrix[j][n];
matrix[j][n] = temp;
}
}
}