腐烂的橘子
题目
在给定的网格中,每个单元格可以有以下三个值之一:
值 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
解题思路
- 思路:广度优先搜索 + 队列;
- 首先找出腐烂的橘子,添加到队列
queue
中; - 当队列(注意:只允许腐烂的橘子入队)不为空且出队(这里弹出首元素)时,如题意所述,与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子先标记为 2(也就是标记为腐烂的橘子),即是
grid[x + dx][y + dy] = 2
,这里 x ,y 表示当前腐烂橘子的位置,dx, dy 表示相邻四个方向的相对距离。 minute
表示持续时间。腐烂橘子扩散污染新鲜橘子时,minute 要在这个层面上加 1,将这个时间作为这个层面变为腐烂橘子的持续时间,入队到queue
。- 根据题意,当队列为空时,还需检测矩阵网格中是否还存在新鲜橘子:若有,返回 -1;否则返回 minute。
代码实现
class Solution:
def orangesRotting(self, grid: List[List[int]]) -> int:
row, col, minute = len(grid), len(grid[0]), 0
directions = [(0, -1), (1, 0), (0, 1), (-1, 0)]
queue = []
for x in range(row):
for y in range(col):
if grid[x][y] == 2:
queue.append((x, y, minute))
while queue:
x, y, minute = queue.pop(0)
for dx, dy in directions:
if 0 <= x + dx < row and 0 <= y + dy < col and grid[x + dx][y + dy] == 1:
grid[x + dx][y + dy] = 2
queue.append((x + dx, y + dy, minute + 1))
for row in grid:
if 1 in row:
return -1
return minute
实现结果
以上就是使用广度优先搜索 + 队列,解决《腐烂的橘子》问题的主要内容。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦