法一:
首先对原数组取其转置矩阵,然后把每行的数字翻转可得到结果,如下所示(其中蓝色数字表示翻转轴):
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for (int i = 0;i<n;i++){
for (int j=i+1;j<n;j++){//要从i+1开始,若从零开始,之前转置过的又转回来了
swap(matrix[i][j],matrix[j][i]);
}
reverse(matrix[i].begin(),matrix[i].end());
}
}
};
法二:
以从对角线为轴翻转,然后再以x轴中线上下翻转即可得到结果,如下图所示(其中蓝色数字表示翻转轴):
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for(int i = 0;i<n;i++)
for(int j=0;j<n-i;j++)
swap(matrix[i][j],matrix[n-1-j][n-1-i]);
for(int i=0;i<n/2;i++)
for(int j=0;j<n;j++)
swap(matrix[i][j],matrix[n-1-i][j]);
}
};
法三:
对于当前位置,计算旋转后的新位置,然后再计算下一个新位置,第四个位置又变成当前位置了,所以这个方法每次循环换四个数字,如下所示:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for(int i = 0;i<n/2;i++)
for(int j=i;j<n-1-i;j++){
int tmp=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]=tmp;
}
}
};