转置后的矩阵最外围的元素不变,可以根据这个性质递归程序
class Solution {
public:
void rotate(vector<vector<int>>& matrix,int x,int y,int m,int n)
{
if(!(x<m&&y<n))
return;
swap(matrix[x][y],matrix[m][n]);
int i,j;
for(i=x,j=y;j<=n;j++,i++)
{
swap(matrix[x][j],matrix[i][n]);
}
swap(matrix[x][y],matrix[m][n]);
for(j=y;j<=n-1;j++)
{
swap(matrix[x][j],matrix[m][j]);
}
for(i=x+1,j=y+1;i<m,j<n;i++,j++)
{
swap(matrix[x][j],matrix[i][y]);
}
for(int l=y+1,r=n-1;l<r;l++,r--)
{
swap(matrix[x][l],matrix[x][r]);
swap(matrix[m][l],matrix[m][r]);
}
rotate(matrix,x+1,y+1,--m,--n);
}
void rotate(vector<vector<int>>& matrix) {
int m=matrix.size();
if(m==0)
return;
int n=matrix[0].size();
rotate(matrix,0,0,m-1,n-1);
}
};update:
先沿对角线⬅️对称变换,再沿中心轴变换
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int m=matrix.size();
if(m==0)
return;
for(int i=0;i<m;i++)
{
for(int j=0;j<i;j++)
swap(matrix[i][j],matrix[j][i]);
}
for(int i=0,j=m-1;i<j;i++,j--)
{
for(int k=0;k<m;k++)
swap(matrix[k][i],matrix[k][j]);
}
}
};
本文介绍了一种高效的矩阵旋转算法实现,通过两次对称变换完成旋转:首先进行沿对角线的对称变换,然后进行沿中心轴的对称变换。这种方法避免了使用额外的空间,实现了原地旋转。
415

被折叠的 条评论
为什么被折叠?



