一、运行结果
二、题目
有一个nxn整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。
给定一个nxn的矩阵,和矩阵的阶数n,请返回旋转后的nxn矩阵。
数据范围:0 < n < 3000,矩阵中的值满足0≤val≤1000
要求:空间复杂度 O(n^2),时间复杂度 O(n^2)
进阶:空间复杂度 O(1),时间复杂度 O(n^2)
示例1
输入: [[1,2,3],[4,5,6],[7,8,9]],3
返回值: [[7,4,1],[8,5,2],[9,6,3]]
三、思路+代码
方法一:用一个同等规模的辅助矩阵,找出元素下标之前的映射关系,直接映射即可。
class Solution {
public:
vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
int top=0, left=0, buttom= n-1, right = n-1;
vector<vector<int>> ans(n,vector<int>(n));
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
ans[i][j] = mat[n-j-1][i];
}
}
return ans;
}
};
方法二:原地旋转,每轮旋转四个位置的元素
class Solution {
public:
vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
int top=0, left=0, buttom= n-1, right = n-1;
for(int i=0; i<n/2; i++){
for(int j=i; j<n-i-1; j++){
int tmp = mat[i][j];
//映射规律:
//右边的列号等于左边的行号,右边的行号等于 n-左边的列号-1
mat[i][j] = mat[n-j-1][i];
mat[n-j-1][i] = mat[n-i-1][n-j-1];
mat[n-i-1][n-j-1] = mat[j][n-i-1];
mat[j][n-i-1] = tmp;
}
}
return mat;
}
};