LeetCode hot100-52-G

java 复制代码
994. 腐烂的橘子
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

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

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

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

官方答案看不懂,没注释。找到个好一点能看懂的解答

https://leetcode.cn/problems/rotting-oranges/solutions/2773461/duo-yuan-bfsfu-ti-dan-pythonjavacgojsrus-yfmh/?envType=study-plan-v2\&envId=top-100-liked

代码是这个网址评论区的

思路bfs。将所有腐烂的句子入队列。然后每次循环都将队列弹出至空,并将这次传染的所有橘子入队列。也就是将同一分钟腐烂的同时出队,下一分钟腐烂的橘子同时入队。很像二叉树层次遍历的感觉。

最初ans=-1是因为最后一次腐烂完的橘子入队后,还需要循环一次把队列清空,这时候ans+1了,但是它清空之后没有能腐烂的橘子了,所以多加了1,最初就用的-1. 因为这个-1的存在还需要Math.max(res, 0),最初就没有腐烂的橘子时ans一直是-1,其实答案是0.

java 复制代码
class Solution {
    static int[][] changes = new int[][] { { -1, 0 }, { 1, 0 }, { 0, 1 }, { 0, -1 } };

    public int orangesRotting(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;

        // 坏橘子队列 [i,j]
        Deque<int[]> queue = new ArrayDeque<>();
        // 好橘子数量
        int goodCount = 0;
        // 遍历所有橘子
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int x = grid[i][j];
                if (x == 2) {
                    queue.add(new int[] { i, j });
                } else if (x == 1) {
                    goodCount++;
                }
            }
        }
        int res = -1;
        // BFS遍历
        while (!queue.isEmpty()) {
            int size = queue.size();
            while (size-- > 0) {
                int[] p = queue.poll();
                int x = p[0];
                int y = p[1];

                for (int i = 0; i < changes.length; i++) {
                    int nx = x + changes[i][0];
                    int ny = y + changes[i][1];
                    // 向四周污染
                    if (nx >= 0 && nx <= m - 1 && ny >= 0 && ny <= n - 1 && grid[nx][ny] == 1) {
                        grid[nx][ny] = 2;
                        // 将新的坏橘子放入队列
                        queue.add(new int[] { nx, ny });
                        goodCount--;
                    }
                }
            }
            res++;
        }
        return goodCount == 0 ? Math.max(res, 0) : -1;
    }
}
相关推荐
梵刹古音2 小时前
【C语言】 字符数组相关库函数
c语言·开发语言·算法
wfeqhfxz25887828 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
芝士爱知识a8 小时前
2026年AI面试软件推荐
人工智能·面试·职场和发展·大模型·ai教育·考公·智蛙面试
Aaron15889 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
石去皿10 小时前
大模型面试通关指南:28道高频考题深度解析与实战要点
人工智能·python·面试·职场和发展
程序员辣条10 小时前
AI产品经理:2024年职场发展的新机遇
人工智能·学习·职场和发展·产品经理·大模型学习·大模型入门·大模型教程
AI大模型测试10 小时前
大龄程序员想转行到AI大模型,好转吗?
人工智能·深度学习·机器学习·ai·语言模型·职场和发展·大模型
美团程序员10 小时前
80道经典常见测试面试题
软件测试·面试·职场和发展·软件测试面试
sunguang201810 小时前
“懂不懂管理,一看便知”:做管理就是3件事,抓大、放小、管细做管理,其实就是要做好三件事:抓大、放小、管细。
经验分享·职场和发展
ProcessOn官方账号10 小时前
程序员如何与同龄人拉开差距?这5张让你快速提升认知,打开格局!
深度学习·职场和发展·学习方法