§1
题目描述
把 n×n 矩阵顺时针旋转 90 度,要求原地修改。
matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出 = [[7,4,1],[8,5,2],[9,6,3]]
§2
思路解析动画文字版
关键不是背模板,而是看懂为什么这题适合矩阵 · 原地旋转。
1. 旋转 = 转置 + 每行反转:顺时针旋转 90° = 沿主对角线转置 + 每行左右反转。原矩阵 [[1,2,3],[4,5,6],[7,8,9]]。
2. 第一步 · 转置:第一步转置:沿主对角线翻折,matrix[i][j] ↔ matrix[j][i]。对角线 1、5、9(灰)不动,其余成对交换 → [[1,4,7],[2,5,8],[3,6,9]]。
3. 关键帧 · 第二步 每行左右反转:关键帧:第二步把每一行左右反转:[1,4,7]→[7,4,1]、[2,5,8]→[8,5,2]、[3,6,9]→[9,6,3] → 旋转完成。
4. 完成 · O(1) 原地:结果 [[7,4,1],[8,5,2],[9,6,3]]。全程在原矩阵上交换元素,不开新矩阵 → O(1) 额外空间。
把这句话记住,下次遇到同类题,就能更快选出方向。
迁移阶梯:把这题练到能复述后,再去同类题里迁移:先复用状态定义,再调整边界条件。
边界三连:边界三连:极端输入先过一遍。
几个高频追问,记住答法。
§3
参考代码
class Solution: def rotate(self, matrix): n = len(matrix) for i in range(n): for j in range(i + 1, n): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] for row in matrix: row.reverse()看懂代码不等于写得出。盖住上面,自己默写一遍试试。卡在哪一行说不清,就点右下角问小欧。
§4
复杂度
- 时间复杂度:O(n²),转置+反转各扫一遍,共约 n² 次交换
- 空间复杂度:O(1),原地交换元素,不开新矩阵
§5
可套用的代码模板
模板不是死背,而是提醒你写代码前先把状态、转移和边界排好。
# 矩阵原地旋转骨架# 顺时针90° = 转置 + 每行反转for i in range(n): for j in range(i+1, n): # 只换上三角 swap(a[i][j], a[j][i]) # 转置for row in a: row.reverse() # 每行左右反转§6
易错点
✗ 错误写法:新建一个矩阵再拷回
✓ 正确写法:原地题用转置加翻转
额外矩阵不符合原地要求
✗ 错误写法:转置时 j 从 0 开始
✓ 正确写法:内层 j 从 i+1 开始
j 从 0 会把每对交换两次、等于没换;只交换上三角。
✗ 错误写法:转置后忘了反转每行
✓ 正确写法:转置 + 每行反转两步缺一不可
只转置是沿对角线镜像,不是旋转;还要左右翻转。
§
面试追问把动画讲成自己的话
追问为什么能 O(1) 原地转?
转置和翻转都在原矩阵上交换元素,不开新矩阵,O(1) 额外空间。
追问逆时针旋转怎么改?
转置 + 上下翻转(或先水平翻转再转置),方向相反。
追问还有别的原地法吗?
可按「环」一圈四元素轮换,但转置+翻转更好写、不易错。
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
下一题 · 数学 & 几何 2/9
→螺旋矩阵
LeetCode 54 · 中等 · 沿着 数学 & 几何 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
299道动画图解
37节语音讲解
28课数据结构
¥0.27折合 / 天
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
¥99 开通年卡 →
想成体系刷透这类套路?去图解算法专题