矩阵——旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
核心思路(两步法)
1.先将矩阵 沿主对角线转置(行和列互换)
2.再将每一行 左右翻转
——>直接得到顺时针旋转90°的矩阵
举个例子(3×3)
原矩阵:
1 2 3
4 5 6
7 8 9
① 转置(对角线互换):
1 4 7
2 5 8
3 6 9
② 每行左右翻转:
7 4 1
8 5 2
9 6 3
→ 这就是 ** 顺时针旋转 90°** 的结果!
完整代码实现如下:
#include
#include
#include
using namespace std;
class Solution {
public:
void rotate(vector<vector
int n = matrix.size();
// 1. 沿主对角线转置矩阵
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
swap(matrix[i][j], matrix[j][i]);
}
}
// 2. 每一行左右翻转
for (int i = 0; i < n; ++i) {
reverse(matrix[i].begin(), matrix[i].end());
}
}
};
// 测试代码
int main() {
vector<vector
{1,2,3},
{4,5,6},
{7,8,9}
};
Solution sol;
sol.rotate(matrix);
// 输出结果
for (auto& row : matrix) {
for (int num : row) {
cout << num << " ";
}
cout << endl;
}
return 0;
}
代码关键说明:
1.转置矩阵(行<->列)
- 只需要遍历上三角(j= i+1),避免重复交换
- 用swap直接交换matrix[i][j]和matrix[j][i]
2.每行左右翻转
- 直接用reverse函数翻转一行元素
- 翻转后就完成了顺时针90°旋转
3. 满足题目要求
✅** 原地修改**:没有使用额外矩阵
✅ 时间复杂度 O (n²):每个元素操作一次
✅ 空间复杂度 O (1):仅用临时变量
什么是「上三角」?
上三角 = 满足** j > i** 的位置
也就是:对角线右上方的所有元素
画出来:
× ✔ ✔
× × ✔
× × ×
✔ 就是上三角。
× 是对角线和下三角,不需要遍历。
为什么只遍历上三角就够了?
因为:
如果你处理了 (i,j)
就同时交换了 (j,i)
如果上下三角都遍历,会发生:
先交换 (0,1) ↔ (1,0)
循环到 j=0,i=1 时又交换一次
→ 交换回去了!等于白换
👉 只遍历上三角,保证每个元素只交换一次,不重复。
主对角线:
主对角线 = 从左上角 → 右下角 的那条斜线(蓝线)
🔹🔸🔸
🔸🔹🔸
🔸🔸🔹
浙公网安备 33010602011771号