题目描述
思路解析动画文字版
核心一句话:用四个边界框住「未走区域」,走完一条边就收一格——这是不重不漏的关键。
① 向右:沿上边界第 0 行,走到 (0,0)=1,收进序列。
① 向右:沿上边界第 0 行,走到 (0,1)=2,收进序列。
① 向右:沿上边界第 0 行,走到 (0,2)=3,收进序列。
① 向右:沿上边界第 0 行,走到 (0,3)=4,收进序列。
上边界第 0 行整行走完 → 收缩:top 从 0 往下挪到 1,这一行以后不再碰。
② 向下:沿右边界第 3 列,走到 (1,3)=5,收进序列。
② 向下:沿右边界第 3 列,走到 (2,3)=6,收进序列。
② 向下:沿右边界第 3 列,走到 (3,3)=7,收进序列。
右边界第 3 列走完 → 收缩:right 从 3 往左挪到 2。
③ 向左:沿下边界第 3 行,走到 (3,2)=8,收进序列。
③ 向左:沿下边界第 3 行,走到 (3,1)=9,收进序列。
③ 向左:沿下边界第 3 行,走到 (3,0)=10,收进序列。
下边界第 3 行走完 → 收缩:bottom 从 3 往上挪到 2。
④ 向上:沿左边界第 0 列,走到 (2,0)=11,收进序列。
④ 向上:沿左边界第 0 列,走到 (1,0)=12,收进序列。
左边界第 0 列走完 → 收缩:left 从 0 往右挪到 1。一圈走完,进入更内层。
① 向右:沿上边界第 1 行,走到 (1,1)=13,收进序列。
① 向右:沿上边界第 1 行,走到 (1,2)=14,收进序列。
上边界第 1 行整行走完 → 收缩:top 从 1 往下挪到 2,这一行以后不再碰。
② 向下:沿右边界第 2 列,走到 (2,2)=15,收进序列。
右边界第 2 列走完 → 收缩:right 从 2 往左挪到 1。
③ 向左:沿下边界第 2 行,走到 (2,1)=16,收进序列。
下边界第 2 行走完 → 收缩:bottom 从 2 往上挪到 1。
top>bottom 或 left>right,活动区域被收成空,16 个格子全部收集完毕。螺旋序列:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]。
单行、单列、单格都是靠「走前判边界」自然兜住,不用额外特判。
LC54 读、LC59 写,共用同一套边界收缩骨架——掌握这个框架两题一起拿下。
参考代码
def spiralOrder(matrix): res = [] top, bottom = 0, len(matrix) - 1 left, right = 0, len(matrix[0]) - 1 while top <= bottom and left <= right: for j in range(left, right + 1): # 右 res.append(matrix[top][j]) top += 1 for i in range(top, bottom + 1): # 下 res.append(matrix[i][right]) right -= 1 if top <= bottom: for j in range(right, left - 1, -1): # 左 res.append(matrix[bottom][j]) bottom -= 1 if left <= right: for i in range(bottom, top - 1, -1): # 上 res.append(matrix[i][left]) left += 1 return res复杂度
- 时间:O(m·n),每个格子恰好被访问一次,进序列一次
- 空间:O(1),除返回的结果数组外,只用四个边界变量
易错点
面试追问把动画讲成自己的话
追问除了边界收缩法,还有别的写法吗?
追问如果要螺旋「生成」一个 n×n 矩阵(LC59)填 1..n²,思路一样吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
矩阵置零
LeetCode 73 · 中等 · 沿着 数学 & 几何 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题