LC 994图论中等第 90 / 95 题

腐烂的橘子

Rotting Oranges

多源 BFS分层
本机进度仅保存在当前浏览器

题目描述

在给定的 m x n 网格 grid 中,每个单元格有三个可能的值:0 空格子、1 新鲜橘子、2 腐烂的橘子。每分钟腐烂橘子四周相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数;如果不可能返回 -1。

示例:grid = [[2,1,1],[1,1,0],[0,1,1]],输出 4。

解题思路

  1. 这是"多源最短路":所有腐烂橘子同时开始扩散,用多源 BFS——初始把全部腐烂橘子入队。
  2. BFS 的层数即扩散的分钟数;每层处理完当前队列全部元素后再进入下一层。
  3. 新鲜橘子被腐烂时计数递减,结束后仍有剩余则返回 -1;注意无新鲜橘子的边界(返回 0)。

参考实现

查看参考实现Python · 建议先自行作答
from collections import deque

def orangesRotting(grid):
    m, n = len(grid), len(grid[0])
    queue = 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
    minutes = 0
    while queue and fresh:
        # 一分钟处理一整层
        for _ in range(len(queue)):
            i, j = queue.popleft()
            for x, y in ((i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)):
                if 0 <= x < m and 0 <= y < n and grid[x][y] == 1:
                    grid[x][y] = 2
                    fresh -= 1
                    queue.append((x, y))
        minutes += 1
    return minutes if not fresh else -1

复杂度与归属

时间复杂度O(m · n)
空间复杂度O(m · n)
所属分类图论
题源LeetCode 994

关联教程

返回题图鉴