转置后的矩阵最外围的元素不变,可以根据这个性质递归程序
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]);
}
}
};