一、最快想到的思路:
找规律,找出原坐标到新坐标的变化规律([x][y] --> [y][n - 1 - x])即可。需注意的是,这种操作涉及到交换,但又不同于一般的两两交换——每次交换操作将涉及到四个点。所以,综上所述,可以将矩阵以每条边的中线为分割线,分成四块,以其中一块为基准进行变换。
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;
}
}
};
二、看过这往篇博客后,发现可以用三维的办法处理二维的矩阵:把矩阵看作一张纸,则旋转90度变化,可看为先进过主对角线对称,再经过中线对称的变化。
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;
}
}
};