leetcode994.腐烂的橘子

标签:广度优先遍历

难度:中等

在给定的 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 。

思路:详细注解见代码

复制代码
// 经典广度优先遍历问题
// 解读一下该题的要求:返回所有橘子都被腐烂所需要的分钟数
// sp.一开始就是所有橘子都被腐烂状态,则直接返回0;最后仍剩余橘子不会被腐烂,返回-1
java 复制代码
public int orangesRotting(int[][] grid) {
        int row = grid.length;
        int col = grid[0].length;
        int ans = 0; // ans记录结果返回分钟数
        int count = 0; //count记录新鲜橘子的数量
        // 广度优先搜索所需要队列,队列里放的是每个格子坐标,因此是int[][]
        Queue<int[]> queue = new LinkedList<>();
        //找到初始时所有的腐烂橘子,作为广度优先搜索的一层
        for(int i = 0; i < row; i++){
            for(int j = 0; j < col; j++){
                if(grid[i][j] == 1)
                    count++;
                else if(grid[i][j] == 2)
                    queue.offer(new int[]{i, j});
            }
        }
        // 一开始就所有都是腐蚀状态,则直接返回0
        if(count == 0)
            return 0;
        // 四个方向广度优先遍历
        while(!queue.isEmpty()){
            if(count == 0)
                return ans; //没有新鲜橘子,返回结果
            ans++; //每一轮搜索分钟数加一
            int size = queue.size();
            for(int i = 0; i < size; i++){
                int[] pair = queue.remove();
                int m = pair[0];
                int n = pair[1];
                if(m > 0 && grid[m - 1][n] == 1){
                    count--;
                    queue.offer(new int[]{m - 1, n});
                    grid[m - 1][n] = 2;
                }
                if(m + 1 < row && grid[m + 1][n] == 1){
                    count--;
                    queue.offer(new int[]{m + 1, n});
                    grid[m + 1][n] = 2;
                }
                if(n > 0 && grid[m][n - 1] == 1){
                    count--;
                    queue.offer(new int[]{m, n - 1});
                    grid[m][n - 1] = 2;
                }
                if(n + 1 < col && grid[m][n + 1] == 1){
                    count--;
                    queue.offer(new int[]{m, n + 1});
                    grid[m][n + 1] = 2;
                }
            }
        }
        // 有剩余橘子没被腐蚀,返回-1
        return -1;
    }
相关推荐
小小小小王王王4 分钟前
求猪肉价格最大值
数据结构·c++·算法
岁忧28 分钟前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
BIYing_Aurora36 分钟前
【IPMV】图像处理与机器视觉:Lec13 Robust Estimation with RANSAC
图像处理·人工智能·算法·计算机视觉
martian6652 小时前
支持向量机(SVM)深度解析:从数学根基到工程实践
算法·机器学习·支持向量机
孟大本事要学习2 小时前
算法19天|回溯算法:理论基础、组合、组合总和Ⅲ、电话号码的字母组合
算法
??tobenewyorker3 小时前
力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
数据结构·c++·算法·leetcode
让我们一起加油好吗3 小时前
【基础算法】贪心 (二) :推公式
数据结构·数学·算法·贪心算法·洛谷
贾全3 小时前
第十章:HIL-SERL 真实机器人训练实战
人工智能·深度学习·算法·机器学习·机器人
GIS小天4 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月4日第128弹
人工智能·算法·机器学习·彩票
满分观察网友z4 小时前
开发者的“右”眼:一个树问题如何拯救我的UI设计(199. 二叉树的右视图)
算法