*leetcode 994.腐烂的橘子

97 阅读1分钟

1. 题目

leetcode.cn/problems/ro…

image.png

2. 考点

广度优先算法BFS

3. 核心代码

从业务需求出发
def test(grid):
    row = len(grid)
    col = len(grid[0])
    bad_lst, good_lst = set(), set()
    for i in range(row):
        for j in range(col):
            grid[i][j] == 2 and bad_lst.add((i, j)) # 腐烂集合
            grid[i][j] == 1 and good_lst.add((i, j)) # 新鲜集合
    count = 0
    while good_lst:
        if not bad_lst: return -1
        tmp_bad = set()
        for i, j in bad_lst:
            for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
                if (i + di, j + dj) in good_lst:
                    tmp_bad.add((i + di, j + dj))
        bad_lst = tmp_bad # 更新腐烂集合
        count += 1
        good_lst -= bad_lst # 剔除腐烂的
    return count


if __name__ == '__main__':
    grid = [[2, 1, 1], [1, 1, 0], [0, 1, 1]]
    print(test(grid))

使用广度优先算法
def test(grid):
    row, col, count = len(grid), len(grid[0]), 0
    directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
    queue = []
    # 所有烂橘子全部入队
    for i in range(row):
        for j in range(col):
            grid[i][j] == 2 and queue.append((i, j, count))
    # 使用bfs进行广度优先搜索
    while queue:
        # 队列先进先出 所以添加从最后添加 出来从首位开始取值
        i, j, count = queue.pop(0)
        for di, dj in directions:
            if 0 <= i + di < row and 0 <= j + dj < col and grid[i + di][j + dj] == 1:
                grid[i + di][j + dj] = 2
                queue.append((i + di, j + dj, count + 1))
    # 判断橘子最后是否还存在没有坏的
    for row in grid:
        if 1 in row: return -1
    return count


if __name__ == '__main__':
    print(test([[2, 1, 1], [1, 1, 0], [0, 1, 1]]))