题目
给你一幅由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 度转换成两次翻转操作:
- 先沿着主对角线翻转(转置),即
- 再沿中线左右翻转,即
比如:
沿着主对角线翻转(转置)后,
再沿中线左右翻转后,
最后得到的就是旋转90度后的矩阵,其中每转置一行就可以翻转一行。
代码
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 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;
}
}
}
}
复杂度分析
-
时间复杂度: ,其中 是 的边长。对于每一次翻转操作,我们都需要矩阵中一半的元素
-
空间复杂度: ,为原地翻转得到的原地旋转。