题干
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
想法
这里用到了一个知识
旋转90度等于让矩阵按轴对称
然后再将每一行反转顺序(也就是按照中心点对称
这里举3 * 3 4 * 4 两个例子使之分别代表奇数偶数
3 * 3
[
[1,2,3],
[4,5,6],
[7,8,9]
]
第一次轴对称以后:
[
[1,4,7],
[2,5,8],
[3,6,9]
]
第二次将每行反转以后
[
[7,4,1],
[8,5,2],
[9,6,3]
]
可以看到旋转成功
偶数个同理
11 12 13 14
15 16 17 18
19 20 21 22
23 24 25 26
第一次:
11 15 19 23
12 16 20 24
13 17 21 25
14 18 22 26
第二次
23 19 15 11
24 20 16 12
25 21 17 13
26 22 18 14
那么代码实现是一样的
注意要求原地旋转,那么第二步就不要直接reverse了
找到重点手动对称就好
Java代码
package daily;
public class Rotate {
public void rotate(int[][] matrix) {
int n=matrix.length;
//先轴对称
for (int i=0;i<n-1;i++){
for (int j=i+1;j<n;j++){
int tem=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=tem;
}
}
int mid=n/2;
//再每行以中点对称
for (int i=0;i<n;i++){
for (int j=0;j<mid;j++){
int res=matrix[i][j];
matrix[i][j]=matrix[i][n-1-j];
matrix[i][n-1-j]=res;
}
}
}
public static void main(String[] args) {
Rotate rotate = new Rotate();
int[][] test = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int[][]test2={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int[][] test3={{1,2},{3,4}};
rotate.rotate(test3);
for (int[] ints : test3) {
for (int num : ints
) {
System.out.print(num);
}
System.out.println();
}
}
}