LeetCode 0994.腐烂的橘子:广度优先搜索(BFS)

【LetMeFly】994.腐烂的橘子:广度优先搜索(BFS)

力扣题目链接:https://leetcode.cn/problems/rotting-oranges/

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

  • 值 0 代表空单元格;
  • 值 1 代表新鲜橘子;
  • 值 2 代表腐烂的橘子。

每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10
  • grid[i][j] 仅为 01 或 2

解题方法:BFS

首先将腐烂的橘子入队。(每个入队的橘子都被标记为0,假设坏掉消失了,反正它最多“往外感染一次”)

接着当队列非空时:

每次将队列中当前元素全部出队,并尝试向上下左右四个方向腐蚀一个橘子。

若腐蚀成功则新橘子入队(并标记为消失)

每轮腐蚀若成功则“腐蚀时间加一”,直至队列为空,判断是否还有完好的橘子。

  • 时间复杂度 O ( m n ) O(mn) O(mn)
  • 空间复杂度 O ( m n ) O(mn) O(mn)

不知本题数据范围为何这么小。

AC代码

C++
const int directions[4][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};

class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        int ans = 0;
        int cntNormal = 0;
        queue<int> q;
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 0; j < grid[0].size(); j++) {
                if (grid[i][j] == 1) {
                    cntNormal++;
                }
                else if (grid[i][j] == 2) {
                    q.push(i * 10 + j);
                    grid[i][j] = 0;
                }
            }
        }
        while (q.size()) {
            bool hasNew = false;
            for (int i = q.size(); i > 0; i--) {
                int x = q.front() / 10, y = q.front() % 10;
                q.pop();
                for (int d = 0; d < 4; d++) {
                    int tx = x + directions[d][0], ty = y + directions[d][1];
                    if (tx >= 0 && tx < grid.size() && ty >= 0 && ty < grid[0].size() && grid[tx][ty] == 1) {
                        grid[tx][ty] = 0;
                        q.push(tx * 10 + ty);
                        cntNormal--;
                        hasNew = true;
                    }
                }
            }
            ans += hasNew;
        }
        return cntNormal ? -1 : ans;
    }
};
Python
# from typing import List


DIRECTIONS = [[0, -1], [0, 1], [-1, 0], [1, 0]]

class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        ans = 0
        cntNormal = 0
        q = []
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == 1:
                    cntNormal += 1
                elif grid[i][j] == 2:
                    q.append((i, j))
                    grid[i][j] = 0
        while q:
            hasNew = False
            newQ = []
            for x, y in q:
                for dx, dy in DIRECTIONS:
                    newX, newY = x + dx, y + dy
                    if newX >= 0 and newX < len(grid) and newY >= 0 and newY < len(grid[0]) and grid[newX][newY] == 1:
                        newQ.append((newX, newY))
                        grid[newX][newY] = 0
                        cntNormal -= 1
                        hasNew = True
            q = newQ
            ans += hasNew
        return -1 if cntNormal else ans

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/138802167

相关推荐

  1. 腐烂橘子 -- DFS、BFS

    2024-05-14 15:04:10       59 阅读
  2. [leetcode] 994. 腐烂橘子

    2024-05-14 15:04:10       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-14 15:04:10       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-14 15:04:10       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-14 15:04:10       87 阅读
  4. Python语言-面向对象

    2024-05-14 15:04:10       96 阅读

热门阅读

  1. python进阶的学习路径

    2024-05-14 15:04:10       32 阅读
  2. @PostMapping和@GetMapping的区别

    2024-05-14 15:04:10       32 阅读
  3. 前端面试题大合集4----框架篇(React)

    2024-05-14 15:04:10       31 阅读
  4. react18+ts如何生成二维码并且下载

    2024-05-14 15:04:10       37 阅读
  5. Kibana初始化启动失败原因及解决办法

    2024-05-14 15:04:10       38 阅读
  6. Day38 斐波那契数 + 爬楼梯 + 使用最小花费爬楼梯

    2024-05-14 15:04:10       32 阅读
  7. 瑞鹤仙——熊市出英雄

    2024-05-14 15:04:10       27 阅读
  8. mysql 拆分字段位多行

    2024-05-14 15:04:10       23 阅读