§1
题目描述
按顺时针螺旋顺序返回矩阵中的所有元素。
matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出 = [1,2,3,6,9,8,7,4,5]
§2
思路解析动画文字版
关键不是背模板,而是看懂为什么这题适合矩阵 · 边界收缩。
1. 四条边界框住整个矩阵:用 top / bottom / left / right 四条边界框住「还没走的区域」,按 右→下→左→上 顺时针走,走完一条边就把它向内收一格。
2. 走上边:左 → 右:沿 top 行从左到右走:1, 2, 3。走完 top 下移一格(top=1)。
3. 走右边:上 → 下:沿 right 列从上到下走:6, 9。走完 right 左移一格(right=1)。
4. 走下边:右 → 左:沿 bottom 行从右到左走:8, 7。走完 bottom 上移一格(bottom=1)。
5. 走左边:下 → 上:沿 left 列从下到上走:4。走完 left 右移一格(left=1)。
6. 关键帧 · 收缩到中心:四条边界一路向内收缩,最后只剩中心 5。顺时针螺旋输出 = [1,2,3,6,9,8,7,4,5]。
把这句话记住,下次遇到同类题,就能更快选出方向。
边界三连:边界三连:极端输入先过一遍。
几个高频追问,记住答法。
§3
参考代码
class Solution: def spiralOrder(self, matrix): ans = [] top, bottom = 0, len(matrix) - 1 left, right = 0, len(matrix[0]) - 1 while top <= bottom and left <= right: for c in range(left, right + 1): ans.append(matrix[top][c]) top += 1 for r in range(top, bottom + 1): ans.append(matrix[r][right]) right -= 1 if top <= bottom: for c in range(right, left - 1, -1): ans.append(matrix[bottom][c]) bottom -= 1 if left <= right: for r in range(bottom, top - 1, -1): ans.append(matrix[r][left]) left += 1 return ans看懂代码不等于写得出。盖住上面,自己默写一遍试试。卡在哪一行说不清,就点右下角问小欧。
§4
复杂度
- 时间复杂度:O(mn),每个格子恰好被走一次,共 m×n 个
- 空间复杂度:O(1),只用 top/bottom/left/right 四个边界变量,迭代无递归栈(不计输出数组)
§5
可套用的代码模板
模板不是死背,而是提醒你写代码前先把状态、转移和边界排好。
Python
# 螺旋矩阵骨架 · 四边界收缩top, bottom, left, right = 0, m-1, 0, n-1while top <= bottom and left <= right: 走上边 left→right; top += 1 走右边 top→bottom; right -= 1 if top <= bottom: # 防扁矩阵重复走下边 走下边 right→left; bottom -= 1 if left <= right: # 防瘦矩阵重复走左边 走左边 bottom→top; left += 1§6
易错点
✗ 错误写法:每走完一边不更新边界
✓ 正确写法:走完一条边就收缩对应边界
否则会重复访问
✗ 错误写法:单行/单列时下边、左边又走一遍
✓ 正确写法:走下边前判 top<=bottom、走左边前判 left<=right
扁矩阵里上边和下边可能是同一行,不judge会重复收集。
✗ 错误写法:变量名和动画不一致
✓ 正确写法:代码变量沿用动画里的核心名字
学习时最怕脑内维护两套概念
§
面试追问把动画讲成自己的话
追问为什么每走完一边要先收缩再判断?
防止单行/单列重复访问;收缩后用 top<=bottom / left<=right 判断是否还有剩余行列。
追问用方向数组+visited 行吗?
行,碰到边界或已访问就转向;但四边界法更直观。
追问复杂度?
O(m·n) 每个元素访问一次。
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
下一题 · 数学 & 几何 3/9
→矩阵置零
LeetCode 73 · 中等 · 沿着 数学 & 几何 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
299道动画图解
37节语音讲解
28课数据结构
¥0.27折合 / 天
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
¥99 开通年卡 →
想成体系刷透这类套路?去图解算法专题