[每日一题][找工作第46天][2025-11-07] Leetcode 994. 腐烂的橘子

题目

994. 腐烂的橘子
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

  • 值 0 代表空单元格;
  • 值 1 代表新鲜橘子;
  • 值 2 代表腐烂的橘子。
    每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
    返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
     
    示例 1:

    输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
    输出:4
    示例 2:
    输入:grid = [[2,1,1],[0,1,1],[1,0,1]]
    输出:-1
    解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。
    示例 3:
    输入:grid = [[0,2]]
    输出:0
    解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
     
    提示:
  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10
  • grid[i][j] 仅为 0、1 或 2

我的代码(Python)

class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        if not grid or not grid[0]:
            return -1
        m = len(grid)
        n = len(grid[0])
        currentCache = []
        nextCache = []
        minutes = 0
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 2:
                    currentCache.append((i, j))
        # print(f'currentCache: {currentCache}')
        while currentCache:
            print(f'currentCache: {currentCache}')
            while currentCache:
                i, j = currentCache.pop()
                for ii, jj in [(i - 1, j), (i, j - 1), (i + 1, j), (i, j + 1)]:
                    if ii < m and jj < n and ii >= 0 and jj >= 0:
                        if grid[ii][jj] == 1:
                            grid[ii][jj] = 2
                            nextCache.append((ii, jj))
            if nextCache:
                minutes += 1
            currentCache = nextCache
            nextCache = []
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1:
                    return -1
        return minutes

点评

想法不难,实现也不难。
根据200. 岛屿数量的官方解法想到了用数组来处理临近结点的问题,不过官方这次改用了生成器,看起来更有趣了。


baddif@gmail.com

AI简历优化站

Nonpareil.me:优化简历,助力职场
开源代码

AI求职跟踪器(建设中)

开源代码

主站(建设中)

Nonpareil Me

相关平台

Github Issues / Notion / Blog

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部