题目描述:给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。
要求:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
题目链接
如果没有上面的要求,我们完全可以在开一个二维数组,将数字按照规则保存进去,但是题目要求只能使用传入的这个数组,这就使题目难度上升了些许。
思路一:双重逆置
- 先将数组以对角线进行逆置(
arr[i][j] 与 arr[j][i] 交换
),比如上面第一个例子,逆置之后如下:
1 4 7
2 5 8
3 6 9 - 接下来只需要以竖中心线进行逆转(
arr[i][j] 与 arr[i][n-j-1]
交换),上面例子交换之后如下:
7 4 1
8 5 2
9 6 3
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 tmp = matrix[j][i];
matrix[j][i] = matrix[i][j];
matrix[i][j] = tmp;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
int tmp = matrix[i][j];
matrix[i][j] = matrix[i][n - j - 1];
matrix[i][n - j - 1] = tmp;
}
}
}
}
思路二:其实旋转就是4个数字为一组进行旋转,比如:16个数字的数组,我们只需要找出4个数字为起点进行一组旋转,旋转4次就可以完成,大概流程如下:
所以只需要找到每【i】行的前【j】个数字作为每组的起点进行4个数字之间的交换即可。
class Solution {
public void rotate(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;
}
}
}
}