力扣LeetCode【每日一题】—— 腐烂的橘子BFS广度优先搜索(Python3)

难度:简单

类型:BFS(Breadth First Search)广度优先搜索

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

值 0 代表空单元格;

值 1 代表新鲜橘子;

值 2 代表腐烂的橘子。

每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。

思路:本题为搜索图像的最短路径,可选择DBF或Dijkstra,考虑到无权,确定使用DBF。(同理,边有权重用Dijkstra)

算法拆解:

1. 找到腐烂橘子的坐标

2. 定义四个搜索方向

3. 写循环腐烂新鲜橘子(设置边界限制)并跟新时间

4.搜索完成后验证是否仍有新鲜橘子,有则返回-1,没有则返回最后的时间

class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        win_x = len(grid)
        win_y = len(grid[0])
        time = 0
        search = [[1, 0], [-1, 0], [0, 1], [0, -1]] #搜索规则
        rot = [] # 模拟queue队列先进先出,而不用stack栈
        # 找腐烂橘子的坐标
        for i in range(win_x):
            for j in range(win_y):
                if grid[i][j] == 2 :
                    rot.append([i, j, 0])
        # 开始腐烂
        while rot:
            x, y, time = rot.pop(0)
            for k in search:
                srh_x = x + k[0]
                srh_y = y + k[1]
                # 边界限制
                if (0 <= srh_x < win_x) and (0 <= srh_y <win_y) and grid[srh_x][srh_y] == 1:
                    grid[srh_x][srh_y] = 2 
                    rot.append([srh_x, srh_y, time + 1])
        # 查找是否存在新鲜橘子
        for row in grid:
            if 1 in row:
                return -1
        # 返回结果
        return time

内存消耗 :13.5 MB, 在所有 Python3 提交中击败了17.24%的用户

时间复杂度:O(nm)

空间复杂度:O(nm)

这里有BFS的题目可以做练习https://blog.youkuaiyun.com/qq_41759198/article/details/81510147

本题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/rotting-oranges

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值