48. 旋转图像
自己解法
这种矩阵题关键还是得记住规律,这个题就是先对称反转,再前后反转,不然在不利用额外空间的情况下确实不好解。
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
// 先对称反转
for (int i = 0; i < n; i++) {
for (int j = i; 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个矩形,分别旋转90度,前一个的列当行,列为n - 1 - 前一个的行,
确定要交换的4个点,然后用(k + 3) % 4进行4个点的交换。
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < n / 2 + n % 2; i++) {
for (int j = 0; j < n / 2; j++) {
int[] tmp = new int[4];
int row = i;
int col = j;
for (int k = 0; k < 4; k++) {
tmp[k] = matrix[row][col];
int x = row;
row = col;
col = n - 1 - x;
}
for (int k = 0; k < 4; k++) {
matrix[row][col] = tmp[(k + 3) % 4];
int x = row;
row = col;
col = n - 1 - x;
}
}
}
}
}