给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
既然题目要求不适用额外空间能否做到,那我们先使用额外空间和最挫的方法来实现:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
vector<vector<int>> res;
int n = matrix.size();
for(int i = 0;i < n;i++)
{
vector<int> line;
for(int j = n - 1;j >= 0;j--)
{
line.push_back(matrix[j][i]);
}
res.push_back(line);
}
swap(res,matrix);
}
};
先构建旋转后的新行,然后每一行插入到res中,最后交换res和matrix。时间复杂度和空间复杂度都是N的平方。
运行结果:
执行结果:
通过
显示详情
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:7.1 MB, 在所有 C++ 提交中击败了73.13%的用户
原地翻转
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 + 1)/2;j++)
{
int temp = matrix[i][j];
matrix[i][j] = matrix[n-1-j][i];
matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
matrix[j][n-1-i] = temp;
}
}
}
};
通过归纳推演,从个例到普遍,详细的解法参考旋转矩阵--力扣题解
两次翻转
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
//水平翻转
int n = matrix.size();
for(int i = 0;i < n/2;i++)
swap(matrix[i],matrix[n-1-i]);
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
cout << matrix[i][j] <<" ";
}
cout << endl;
}
//对角线翻转
for(int i = 0;i < n;i++)
{
for(int j = i + 1;j < n;j++)
{
swap(matrix[i][j],matrix[j][i]);
}
}
}
};
先水平翻转再沿对角线翻转,运行效率:
Runtime: 0 ms, faster than 100.00% of C++ online submissions for Rotate Image.
Memory Usage: 7 MB, less than 95.80% of C++ online submissions for Rotate Image.