cpp
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for(int i = 0;i<n;i++){
for(int j=i;j<n;j++){
swap(matrix[i][j],matrix[j][i]);
}
}
for(int i=0;i<n;i++){
reverse(matrix[i].begin(),matrix[i].end());
}
}
};
这段代码的作用就是:把一个 \(n \times n\) 的矩阵顺时针旋转 90°。核心只有两步。
原矩阵假设是:
1 2 3
4 5 6
7 8 9
第一步,沿主对角线转置:
for(int i = 0; i < n; i++){
for(int j = i; j < n; j++){
swap(matrix[i][j], matrix[j][i]);
}
}
swap(matrix[i][j], matrix[j][i]) 就是把行列位置交换,例如:
2 ↔ 4
3 ↔ 7
6 ↔ 8
于是:
1 2 3 1 4 7
4 5 6 → 2 5 8
7 8 9 3 6 9
这里 j = i 是为了只交换主对角线右上方的元素,防止同一对元素交换两次又换回来。
第二步,把每一行左右反转:
for(int i = 0; i < n; i++){
reverse(matrix[i].begin(), matrix[i].end());
}
也就是:
1 4 7 7 4 1
2 5 8 → 8 5 2
3 6 9 9 6 3
最终:
7 4 1
8 5 2
9 6 3
这就是原矩阵顺时针旋转 90°。
所以这道题最简单的记忆方式就是:
顺时针旋转 90° = 先转置 + 再每行反转
时间复杂度是 \(O(n^2)\) ,额外空间复杂度是 \(O(1)\)。