【力扣100】994.腐烂的橘子tangerine

添加链接描述

python 复制代码
class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        # 思路是bfs,使用队列控制腐烂橘子的进出,然后在while循环末位对结果进行控制
        if not grid or len(grid)==0:
            return -1
            
        def check_zeros(array):
            for row in array:
                for elem in row:
                    if elem != 0:
                        return False
            return True
        myflag=check_zeros(grid)
        if myflag:
            return 0

        que=collections.deque()
        result=0
        row=len(grid)
        col=len(grid[0])
        for i in range(row):
            for j in range(col):
                if grid[i][j]==2:
                    que.append([i,j])
                if (
                    (i-1<0 or grid[i-1][j]==0) and 
                    (j-1<0 or grid[i][j-1]==0) and 
                    (i+1>=row or grid[i+1][j]==0) and 
                    (j+1>=col or grid[i][j+1]==0) and 
                    grid[i][j]==1
                    ):
                    return -1
        if not que:
            return -1
        while que:
            size=len(que)
            result+=1
            while size:
                cur=que.popleft()
                x=cur[0]
                y=cur[1]
                if x-1>=0 and grid[x-1][y]==1:
                    que.append([x-1,y])
                    grid[x-1][y]=2
                if y-1>=0 and grid[x][y-1]==1:
                    que.append([x,y-1])
                    grid[x][y-1]=2
                if x+1<row and grid[x+1][y]==1:
                    que.append([x+1,y])
                    grid[x+1][y]=2
                if y+1<col and grid[x][y+1]==1:
                    que.append([x,y+1])
                    grid[x][y+1]=2
                size-=1
        return result-1

思路:

  1. bfs,使用队列维护,使用reslut控制结果
  2. 我自己写的这个打了很多补丁,然后还是有很多条件没有考虑到,但大体上bfs的思路是正确的

官方题解(也是bfs,而且多源我也考虑到了):

python 复制代码
class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        R, C = len(grid), len(grid[0])

        # queue - all starting cells with rotting oranges
        queue = collections.deque()
        for r, row in enumerate(grid):
            for c, val in enumerate(row):
                if val == 2:
                    queue.append((r, c, 0))

        def neighbors(r, c) -> (int, int):
            for nr, nc in ((r - 1, c), (r, c - 1), (r + 1, c), (r, c + 1)):
                if 0 <= nr < R and 0 <= nc < C:
                    yield nr, nc

        d = 0
        while queue:
            r, c, d = queue.popleft()
            for nr, nc in 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
相关推荐
Cha0DD7 小时前
【由浅入深探究langchain】第二十集-SQL Agent+Human-in-the-loop
人工智能·python·ai·langchain
Cha0DD7 小时前
【由浅入深探究langchain】第十九集-官方的SQL Agent示例
人工智能·python·ai·langchain
阿豪学编程8 小时前
LeetCode724.:寻找数组的中心下标
算法·leetcode
智算菩萨8 小时前
【Tkinter】4 Tkinter Entry 输入框控件深度解析:数据验证、密码输入与现代表单设计实战
python·ui·tkinter·数据验证·entry·输入框
墨韵流芳8 小时前
CCF-CSP第41次认证第三题——进程通信
c++·人工智能·算法·机器学习·csp·ccf
七夜zippoe9 小时前
可解释AI:构建可信的机器学习系统——反事实解释与概念激活实战
人工智能·python·机器学习·可解释性·概念激活
csdn_aspnet9 小时前
C# 求n边凸多边形的对角线数量(Find number of diagonals in n sided convex polygon)
开发语言·算法·c#
禹中一只鱼9 小时前
【力扣热题100学习笔记】 - 哈希
java·学习·leetcode·哈希算法
凌波粒9 小时前
LeetCode--349.两个数组的交集(哈希表)
java·算法·leetcode·散列表
paeamecium10 小时前
【PAT甲级真题】- Student List for Course (25)
数据结构·c++·算法·list·pat考试