@二维数组旋转
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
给定 matrix =
[
[1, 2, 3, 4],
[ 5, 6, 7, 8],
[9,10,11,12],
[13,14,15,16]
],
原地旋转输入矩阵,使其变为:
[
[13,9,5,1],
[14,10,6,2],
[15,11,7,3],
[16,12,8,4]
]
通过观察我们发现:
原来第i列,第j行,变成了第j列,第n-i行;行号就是原来的列号,单列号是与之前行号互补的;
于是上下翻转目的是将互补变成相同,然后i和j就可以互换了,也就是对角线翻转。
1 2 3 4 13 14 15 16
5 6 7 8 9 10 11 12
------------ =水平翻转=> ------------
9 10 11 12 5 6 7 8
13 14 15 16 1 2 3 4
15 14 12 16 15 13 2 5
13 3 6 7 =主对角线翻转=> 14 3 4 1
2 4 8 10 12 6 8 9
5 1 9 11 16 7 10 11
先上下翻转再对称翻转,需要写两个嵌套循环。
这道题题目中要求说不能占用额外空间,就是不能用辅助数组来帮助旋转,但可以通过定义少个变量来实现。
如下:(用a来临时存储)
for(j = 0;j<n;j++){
int a = matrix[i][j];
matrix[i][j] = matrix[n-i-1][j];
matrix[n-i-1][j] = a;
}
}
// An highlighted block
class Solution {
public void rotate(int[][] matrix) {
int i;
int j;
int n = matrix.length;
for(i = 0;i<n/2;i++){
for(j = 0;j<n;j++){
int a = matrix[i][j];
matrix[i][j] = matrix[n-i-1][j];
matrix[n-i-1][j] = a;
}
}
for(i = 0;i<n;i++){
for(j = 0;j<i;j++){
int b = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = b;
}
}
}
}