题目
方法一
其实在做这题的时候画图已经把这种方法给画出来了,但是没深入想,没有找到具体的规律!整体矩阵的顺时针旋转可以分解为:
(1)每个外圈的旋转
(2)每个圈都分为左上,左下,右上,右下
(3)左上 = 左下; 左下 = 右下; 右下 = 右上; 右上 = 左上
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int up_limit = 0;
int down_limit = matrix.size()-1;
// 因为矩阵是n×n的,所以up_limit可以代表左界和上界,down_limit可以代表右界和下界
/*
左上:(up_limit,0)
左下:(2,up_limit)
右上:(0,down_limit)
右下:(down_limit,2)
*/
while(up_limit<=down_limit){
int p1 = up_limit;
int p2 = down_limit;
while(p1!=down_limit){
int tmp = matrix[up_limit][p1];
matrix[up_limit][p1] = matrix[p2][up_limit];
matrix[p2][up_limit] = matrix[down_limit][p2];
matrix[down_limit][p2] = matrix[p1][down_limit];
matrix[p1][down_limit] = tmp;
p1++;
p2--;
}
up_limit++;
down_limit--;
}
}
};
方法二
最简单直白的做法,先对矩阵上下翻转,再依据对角线交换:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
reverse(matrix.begin(),matrix.end());
for(int i = 0;i<matrix.size();i++){
for(int j=0;j<=i;j++){
int tmp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = tmp;
}
}
}
};