矩阵——旋转图像

给定一个 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 // 用于 reverse
using namespace std;

class Solution {
public:
void rotate(vector<vector>& matrix) {

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> matrix = {
{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 时又交换一次
交换回去了!等于白换
👉 只遍历上三角,保证每个元素只交换一次,不重复。

主对角线:
主对角线 = 从左上角 → 右下角 的那条斜线(蓝线)
🔹🔸🔸
🔸🔹🔸
🔸🔸🔹

posted @ 2026-03-31 20:25  ZealousMclaren  阅读(34)  评论(0)    收藏  举报