问题描述
有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。
给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵。
数据范围:0<n<300,矩阵中的值满足 0≤val≤1000
要求:空间复杂度 ,时间复杂度
进阶:空间复杂度 O(1),时间复杂度
思路一:
研究旋转时元素的变化关系:比如原来位置为[0,1],顺时针旋转后位置为[1,n-1];
可以观察到元素的列j变成了下一个位置的行j,列值变为n-1-i;
那么我们只需要索引矩阵的一角,逐次替换4次(不需要额外空间);
还有一个需要注意的地方是
如果行数列数是奇数比如3,那么只能移动[0,0],[0,1]两个位置;
时间复杂度:
空间复杂度:O(1)
class Solution {
public:
vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
// write code here
int mid1 = 0, mid2 = 0;
if(n%2 == 0)
{
mid1 = n/2;
mid2 = n/2;
}
else
{
mid1 = n/2+1;
mid2 = n/2;
}
for(int i = 0; i < mid1; i++)
{
for(int j = 0; j < mid2; j++)
{
int tmp = mat[j][n-1-i];
mat[j][n-1-i] = mat[i][j];
int tmp2 = mat[n-1-i][n-1-j];
mat[n-1-i][n-1-j]=tmp;
tmp = mat[n-1-j][i];
mat[n-1-j][i]=tmp2;
mat[i][j]=tmp;
}
}
return mat;
}
};
思路二:
通过矩阵转置后再将每行旋转;
非常的简单粗暴!
时间复杂度:
空间复杂度:O(1)
class Solution {
public:
vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
// write code here
for(int i = 0; i < n; i++)
{
for(int j = 0; j < i; j++)
{
swap(mat[i][j],mat[j][i]);
}
}
for(int i = 0; i < n; i++)
{
reverse(mat[i].begin(),mat[i].end());
}
return mat;
}
};