题目描述
思路解析动画文字版
转折:普通 BFS 从一个点出发,这里腐烂是同时从多处发生的。所以把所有初始烂橘子一次性放进队列,再用 for _ in range(len(q)) 一次只处理「这一层」,每推进一整层就过去一分钟。开始前先数一遍好橘子 fresh,最后用它判断是否全烂。
第 0 分钟 · 标源 + 数 fresh:扫一遍:好橘子 fresh=6(绿),唯一的烂橘子 (0,0)(橙)入队,灰色 (1,2)、(2,0) 是空格。计时 0 分钟。
准备处理第 1 层 · 出队 (0,0):本层只有 (0,0)。看它上下左右:上、左越界,右 (0,1) 和下 (1,0) 是好橘子,要被传染。计时还停在 0——等这层邻居真的烂了,才算过去 1 分钟。
第 1 分钟 · 右/下变烂:(0,1)、(1,0) 变烂(高亮),fresh 6→4,它们入队等下一层。第 1 分钟结束。
第 2 分钟 · 这一层一起扩散:本层 (0,1)、(1,0) 同时传染各自的好邻居:(0,2) 和 (1,1) 变烂,fresh 4→2。
第 2 分钟 · 空格挡路(负例):负例:(1,1) 想往右传到 (1,2)、(1,0) 想往下传到 (2,0),但这两格是空格 0,腐烂传不过去,直接跳过。只有值为 1 的好橘子才会被传染。
第 3 分钟 · 绕过空格继续:第 3 分钟:(1,1) 往下把 (2,1) 传染变烂,fresh 2→1。
第 4 分钟 · 最后一个变烂:第 4 分钟:(2,1) 把最后的 (2,2) 传染,fresh 1→0。
检查 fresh==0 → 返回 4:队列空了,检查 fresh==0:全烂!返回 4 分钟。若还剩好橘子(被空格隔绝),就返回 -1。
以后你遇到「同时从多处扩散、求最短时间/距离」的题,就用多源 BFS:01 矩阵、地图分析都是它。
边界三连:三种边界先想清楚。
面试官常追问:三个高频追问,答法记牢。
参考代码
from collections import dequeclass Solution: def orangesRotting(self, grid): m, n = len(grid), len(grid[0]) q = deque(); fresh = 0 for r in range(m): for c in range(n): if grid[r][c] == 2: q.append((r, c)) # 所有烂橘子入队 elif grid[r][c] == 1: fresh += 1 minutes = 0 dirs = [(1,0),(-1,0),(0,1),(0,-1)] while q and fresh: for _ in range(len(q)): # 按层(分钟)处理 r, c = q.popleft() for dr, dc in dirs: nr, nc = r+dr, c+dc if 0 <= nr < m and 0 <= nc < n and grid[nr][nc] == 1: grid[nr][nc] = 2; fresh -= 1; q.append((nr, nc)) minutes += 1 return minutes if fresh == 0 else -1复杂度
- 时间复杂度:O(m×n),每格进出队一次
- 空间复杂度:O(m×n),队列最多装一层
可套用的代码模板
记住骨架:所有起点一次性入队、for _ in range(len(q)) 锁层、每层 +1。01 矩阵、地图分析都是把多个源同时入队,和单源 BFS 只差「起点个数」。
Python
# 「同时从多个源扩散、求最短时间/距离」都套q = deque(所有起点); seen = set(所有起点)level = 0while q: for _ in range(len(q)): # 锁定"这一层" x = q.popleft() for y in 邻居(x): if y not in seen: seen.add(y); q.append(y) level += 1 # 一层 = 一个时间单位易错点
面试追问把动画讲成自己的话
追问核心思路是什么?
追问为什么要按层处理(每轮记 len(q))?
追问复杂度多少?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
墙与门
LeetCode 286 · 中等 · 沿着 图 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题