0 题目来源
1 涉及到的知识点
2 题目描述
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
3 样例
示例 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]
]
4 思路
4.1 方法一:逐层逐个交换
本题要求不要占用额外的矩阵空间,因此可以想到采用交换元素的方法。
为了减小时间复杂度,因此采用逐层遍历的方法。
交换方法如下:(圈内和圈内的交换)
每个矩阵共有(向下取整)层(N为行/列数),每层都以此类推,每部分元素交换3次。
该方法难点在于每个元素坐标的计算和表示,需花费较多时间推导。 关键等式为:matrix[row][col]=matrix[n−col−1][row]
4.2 方法二:翻转矩阵
先将矩阵水平翻转90度,然后再沿着对角线翻转一次,就可以得到旋转90度的矩阵。
点击查看:力扣的官方题解解释
5 代码
5.1 方法一
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int N=matrix.size();
for(int i=0;i<N/2;i++)//遍历层数
{
for(int j=i+1;j<N-i;j++)
{
swap(matrix[N-1-i][j],matrix[N-1-j][N-1-i]);
swap(matrix[N-1-j][N-1-i],matrix[i][N-1-j]);
swap(matrix[i][N-1-j],matrix[j][i]);
}
}
}
};
5.2 方法2
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
// 水平翻转
for (int i = 0; i < n / 2; ++i) {
for (int j = 0; j < n; ++j) {
swap(matrix[i][j], matrix[n - i - 1][j]);
}
}
// 主对角线翻转
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
swap(matrix[i][j], matrix[j][i]);
}
}
}
};
/*本方法来自力扣官方题解*/