Algorithm
- [🎯 问题](#🎯 问题)
- [🏛 通俗解释](#🏛 通俗解释)
- [🛠️ 伪代码](#🛠️ 伪代码)
- [⚡ C++ 实现](#⚡ C++ 实现)
- [📦 示例](#📦 示例)
- [📚 时间 & 空间复杂度分析](#📚 时间 & 空间复杂度分析)
🎯 问题
给定一个 n × n
的二维矩阵 matrix
,将其 原地顺时针旋转 90°。
⚠️ 要求:
- 必须在原地修改
matrix
; - 不允许使用额外的矩阵来存储结果。
🏛 通俗解释
旋转 90° 可以分解为两步:
-
转置 (transpose):把
matrix[i][j]
和matrix[j][i]
交换(沿主对角线翻转)。例子:
1 2 3 1 4 7 4 5 6 → 2 5 8 7 8 9 3 6 9
-
翻转每一行(reverse row):把每一行左右对称交换。
1 4 7 7 4 1 2 5 8 → 8 5 2 3 6 9 9 6 3
最终得到的就是顺时针旋转 90° 的结果。
🛠️ 伪代码
function rotate(matrix):
n = len(matrix)
# 第一步:转置矩阵
for i in 0..n-1:
for j in i..n-1:
swap(matrix[i][j], matrix[j][i])
# 第二步:翻转每一行
for i in 0..n-1:
reverse(matrix[i])
⚡ C++ 实现
cpp
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
// 1. 转置矩阵
for (int i = 0; i < n; i++) {
for (int j = i; 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());
}
}
};
📦 示例
输入:
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
输出:
7 4 1
8 5 2
9 6 3
📚 时间 & 空间复杂度分析
- 时间复杂度 :O(n²)
- 转置需要访问矩阵上三角部分(约 n²/2),翻转每行 O(n),合计 O(n²)。
- 空间复杂度 :O(1)
- 只在原地交换,不需要额外的存储空间。