leetcode hot100 994. 腐烂的橘子 medium bfs


DFS 是一条路走到黑。而这道题要求的是**"最小分钟数",这本质上是在求最短路径/层数**,是 BFS

  1. 第一步:全员集合。先把网格里所有腐烂的橘子坐标都放进一个队列(Queue)里。

  2. 第二步:层层扩散。

    • 第 0 分钟:初始的腐烂橘子在队列里。
    • 第 1 分钟:这些橘子向四周扩散,把第一圈新鲜橘子变腐。
    • 第 2 分钟:新变腐的橘子再向外扩散......
  3. 这就是"层序遍历":每一分钟就是 BFS 的一层。


python 复制代码
from collections import deque


class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:

        rows, cols = len(grid), len(grid[0])
        queue = deque()
        fresh_count = 0

        # 1. 初始化:统计新鲜橘子数量,并将所有腐烂橘子入队
        for r in range(rows):
            for c in range(cols):
                if grid[r][c] == 1:
                    fresh_count += 1
                elif grid[r][c] == 2:
                    queue.append((r, c))   # 腐烂橘子(i,j)坐标

        # 如果没有新鲜橘子,直接返回 0
        if fresh_count == 0: 
            return 0

        minutes = 0
        # 2. 用 BFS 扩散腐烂橘子,直到没有腐烂或新鲜橘子
        while queue and fresh_count > 0:
            minutes += 1
            for _ in range(len(queue)):
                r, c = queue.popleft()  # 弹出一个腐烂橘子(i,j)坐标

                # 检查(r, c)的四个方向
                for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
                    nr, nc = r + dr, c + dc

                    # 未出界,且如果是新鲜橘子,则变腐烂并入队
                    if 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] == 1:
                        grid[nr][nc] = 2
                        fresh_count -= 1   # 新鲜橘子-1
                        queue.append((nr, nc))   # 变腐烂并入队,待会继续腐烂别的橘子

        # 3. 最后检查是否还有新鲜橘子
        if fresh_count == 0: 
            return minutes 
        else:
            return -1

时间复杂度:O(mn),其中 m 和 n 分别为 grid 的行数和列数。

空间复杂度:O(mn)。

相关推荐
mmmmath_38 小时前
LeetCode.541.反转字符串II
数据结构·算法·leetcode
Navigator_Z9 小时前
LeetCode //MySQL - 1251. Average Selling Price
c语言·算法·leetcode
参.商.10 小时前
【Day 53】76. 最小覆盖子串
leetcode·golang
虚无的纽扣13 小时前
【力扣刷题】第二天:无重复字符的最长字串、移动零问题
算法·leetcode·排序算法
圣保罗的大教堂16 小时前
leetcode 3742. 网格中得分最大的路径 中等
leetcode
我不会起名字32218 小时前
一天一道算法题(35):电话号码的字母组合
java·数据结构·后端·python·leetcode·go·回溯
萧西待水18 小时前
奥赛一本通 1451 棋盘游戏
算法·宽度优先
圣保罗的大教堂19 小时前
leetcode 2033. 获取单值网格的最小操作数 中等
leetcode
6Hzlia19 小时前
【Classic 150 刷题计划】 LeetCode 242. 有效的字母异位词 | C++ 哈希计数与严密防线
c++·算法·leetcode
wabs66619 小时前
关于二叉树【力扣101.对称二叉树的思考】
数据结构·c++·算法·leetcode·二叉树