题目:
思路:
- 统计新鲜橘子的数量,记录腐烂橘子的位置(多源 BFS 起点)
- 逐层扩散(每一层对应 1 分钟),每次扩散将相邻新鲜橘子腐烂
- 最终若仍有新鲜橘子未腐烂,返回
-1;否则返回扩散的分钟数。
代码:
from typing import List from collections import deque class Solution: def orangesRotting(self, grid: List[List[int]]) -> int: m, n = len(grid), len(grid[0]) q = deque() # 存储腐烂橘子的坐标 fresh = 0 # 新鲜橘子数量 # 初始化:统计新鲜橘子,将腐烂橘子加入队列 for i in range(m): for j in range(n): if grid[i][j] == 1: fresh += 1 elif grid[i][j] == 2: q.append((i, j)) # 边界情况:无新鲜橘子,直接返回0 if fresh == 0: return 0 minutes = 0 # 记录耗时 # 上下左右四个方向 dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 多源BFS扩散 while q and fresh > 0: # 处理当前层(当前分钟的所有腐烂橘子) level_size = len(q) for _ in range(level_size): i, j = q.popleft() # 遍历四个方向 for dx, dy in dirs: x = i + dx y = j + dy # 坐标合法且为新鲜橘子 if 0 <= x < m and 0 <= y < n and grid[x][y] == 1: grid[x][y] = 2 # 标记为腐烂 fresh -= 1 # 新鲜橘子数减1 q.append((x, y)) # 加入队列供下一层处理 minutes += 1 # 每处理完一层,时间+1 # 若仍有新鲜橘子,返回-1;否则返回耗时 return minutes if fresh == 0 else -1