1. 问题背景与场景还原
这道力扣hot100题描述的腐烂橘子问题,本质上是一个典型的广度优先搜索(BFS)应用场景。想象一下这样的画面:超市货架上摆放着一箱箱新鲜橘子,突然有几个橘子开始腐烂。每分钟,与腐烂橘子相邻(上下左右)的新鲜橘子都会被感染。我们需要计算:全部橘子腐烂所需的最短时间,或者确定是否存在永远无法腐烂的橘子。
这个问题在实际生活中有着广泛的应用场景:
- 传染病传播模型模拟
- 森林火灾蔓延预测
- 计算机网络病毒传播分析
- 自动化仓库货物变质监控
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法核心思路解析
2.1 问题建模与抽象化
首先我们需要将问题转化为计算机可以处理的数据结构。题目给出的二维网格可以表示为一个m×n的矩阵,其中:
- 0代表空格(没有橘子)
- 1代表新鲜橘子
- 2代表腐烂橘子
关键观察点:
- 多源点传播:初始时可能有多个腐烂橘子
- 同步感染:所有腐烂橘子在同一分钟内同时感染相邻新鲜橘子
- 终止条件判断:当无法继续感染或所有新鲜橘子都被感染时停止
2.2 BFS算法选择依据
为什么选择BFS而不是DFS?因为:
- BFS天然适合"等距离扩散"的场景
- 可以准确记录每一"层"(分钟)的感染情况
- 时间复杂度更优(O(mn) vs DFS可能的O(m²n²))
3. 详细实现步骤
3.1 初始化阶段
python复制def orangesRotting(grid):
m, n = len(grid), len(grid[0])
queue = collections.deque()
fresh = 0
# 初始化:记录所有腐烂橘子的位置和新鲜橘子数量
for i in range(m):
for j in range(n):
if grid[i][j] == 2:
queue.append((i, j))
elif grid[i][j] == 1:
fresh += 1
3.2 BFS核心逻辑
python复制 minutes = 0
directions = [(-1,0)
