关键在于原地。
思路一:转置+镜像对称
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int m = matrix.size();
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; i < m; ++i){//镜像对称
for(int j = 0; j < m/2; ++j){
swap(matrix[i][j], matrix[i][m-j-1]);
}
}
}
};
当然先上下再对角也是可以的。
别人的简洁代码:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
for (int i=0; i<matrix.size(); i++)
for (int j=0; j<i; j++) swap(matrix[i][j], matrix[j][i]);
for (auto& row: matrix) reverse(row.begin(), row.end());
}
};
思路二:由外而内,真正的旋转
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int temp;
int n=matrix.size();
for(int i=0;i<n/2;i++){
for(int j=i;j<n-i-1;j++){
temp=matrix[i][j];
matrix[i][j]=matrix[n-j-1][i];
matrix[n-j-1][i]=matrix[n-1-i][n-j-1];
matrix[n-1-i][n-j-1]=matrix[j][n-1-i];
matrix[j][n-1-i]=temp;
}
}
}
};
转换关系最好画图理解,简单优化一下:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int temp;
int n=matrix.size();
for(int i=0;i<n/2;i++){
for(int j=i;j<n-i-1;j++){
swap(matrix[i][j], matrix[j][n-1-i]);
swap(matrix[i][j], matrix[n-1-i][n-1-j]);
swap(matrix[i][j], matrix[n-1-j][i]);
}
}
}
};