美文网首页
994. 腐烂的橘子(Python)

994. 腐烂的橘子(Python)

作者: 玖月晴 | 来源:发表于2021-05-13 21:06 被阅读0次

难度:★★★☆☆
类型:数组
方法:宽度优先搜索,队列

题目

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

在给定的网格中,每个单元格可以有以下三个值之一:

值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。

示例 1:

输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4

示例 2:

输入:[[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。

示例 3:

输入:[[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

提示:

1 <= grid.length <= 10
1 <= grid[0].length <= 10
grid[i][j] 仅为 0、1 或 2

解答

对于二维数组的小岛类型的问题,常常使用深度优先搜索或宽度优先搜索来解决,而像这样涉及到层次信息的题目,常常使用宽度优先搜索,在实现上,用队列就可以。

我们定义一个函数get_neighbors,用来获取某个点的周围点,在函数内部就对周围点的合法性作出了判断,使用yield代替return的函数实际上是一个生成器,效果和返回列表一样的。

我们准备一个空的队列deque,队列中存放的是一个个的元组,元组中包含三个数值,分别是点的横纵坐标以及当前时间(也就是腐烂中心蔓延的层次数)。换句话说,这个队列,存放的是所有腐烂橘子所在位置,以及各自对应的腐烂时间。

初始状况下,将所有腐烂的橘子添加到队列中。

遍历过程用while实现,对于弹出队列的烂橘子,研究其合法邻居是否存在好橘子,如果存在,则将这个好橘子腐烂掉,并将新的烂橘子连同它腐烂的时间一并添加到队列尾。整个过程直到队列中没有元素了为止。

需要注意的是,如果遍历完成后,某些橘子还没有腐烂,说明这些橘子是独立于腐烂区域的,因此按照题目要求需要返回0。否则返回计数器所统计的腐烂时间d。

class Solution:
    def orangesRotting(self, grid):
        row, column = len(grid), len(grid[0])
        grid = grid
        queue = []

        for r in range(row):
            for c in range(column):
                if grid[r][c] == 2:
                    queue.append((r, c, 0))

        def get_neighbors(r, c):
            for nr, nc in ((r-1, c), (r, c-1), (r+1, c), (r, c+1)):
                if 0 <= nr < row and 0 <= nc < column:
                    yield nr, nc

        d = 0
        while queue:
            r, c, d = queue.pop(0)
            for nr, nc in get_neighbors(r, c):
                if grid[nr][nc] == 1:
                    grid[nr][nc] = 2
                    queue.append((nr, nc, d+1))

        if any(1 in row for row in grid):
            return -1
        return d

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

相关文章

  • 994. 腐烂的橘子(Python)

    难度:★★★☆☆类型:数组方法:宽度优先搜索,队列 题目 力扣链接请移步本题传送门[https://leetcod...

  • 994.腐烂的橘子

    原题 https://leetcode-cn.com/problems/rotting-oranges/ 解题思路...

  • 994.腐烂的橘子

    由题目我们可以知道每分钟每个腐烂的橘子都会使上下左右相邻的新鲜橘子腐烂,这其实是一个模拟广度优先搜索的过程。所谓广...

  • queue:994.腐烂的橘子

    考点:队列 动态的遍历queue 遍历queue的同时会追加元素 广度优先搜索算法

  • LeetCode 994. 腐烂的橘子

    在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂...

  • Leetcode 994. 腐烂的橘子

    题目描述 在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2...

  • 994. 腐烂的橘子-广度优先搜索BFS

    题目:https://leetcode-cn.com/problems/rotting-oranges/ 我的方法...

  • 腐烂的橘子

    题目: 题目的理解: 分几个小步骤思考: 1. 网格中是否还有正常的橘子。 2. 网格中坏橘子的位置。 3. 怀橘...

  • 542. 01 矩阵、1162. 地图分析、994. 腐烂的橘子

    本次的三道题都用了多源点BFS的方法,关于什么是多源点BFS呢,就是求很多个起点到一个终点的关系,就将终点入队,反...

  • 正在慢慢腐烂的橘子

    把一个稍腐烂的橘子包上华丽的包装 放在冰箱里 你看不见它还在慢慢腐烂的身体 却暗自欣赏它上了包装的外边

网友评论

      本文标题:994. 腐烂的橘子(Python)

      本文链接:https://www.haomeiwen.com/subject/ivbfhltx.html