leetcode 994腐烂的橘子

复制代码
class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        int m = grid.size();        // 行数
        int n = grid[0].size();     // 列数

        int orange = 0;             // 新鲜橘子的数量
        int pre = 0;                // 记录上一轮扩散前的新鲜橘子数量
        int minute = 0;             // 经过的分钟数

        // 先统计一共有多少个新鲜橘子
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {
                    orange++;
                }
            }
        }

        // 还有新鲜橘子,并且上一轮有新的橘子被腐烂
        while (orange > 0 && orange != pre) {

            // 保存这一轮扩散前的新鲜橘子数量
            pre = orange;

            // 遍历整个网格,寻找当前这一分钟应该扩散的腐烂橘子
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {

                    // 2:初始腐烂
                    // 3:第1分钟腐烂
                    // 4:第2分钟腐烂......
                    if (grid[i][j] == minute + 2) {

                        // 下
                        if (i + 1 < m && grid[i + 1][j] == 1) {
                            grid[i + 1][j] = minute + 3; // 下一分钟腐烂
                            orange--;
                        }

                        // 上
                        if (i - 1 >= 0 && grid[i - 1][j] == 1) {
                            grid[i - 1][j] = minute + 3;
                            orange--;
                        }

                        // 左
                        if (j - 1 >= 0 && grid[i][j - 1] == 1) {
                            grid[i][j - 1] = minute + 3;
                            orange--;
                        }

                        // 右
                        if (j + 1 < n && grid[i][j + 1] == 1) {
                            grid[i][j + 1] = minute + 3;
                            orange--;
                        }
                    }
                }
            }

            // 完成一轮扩散,时间 +1
            minute++;
        }

        // 传播结束后还有新鲜橘子,说明这些橘子永远无法被腐烂
        if (orange > 0) {
            return -1;
        }

        // 所有新鲜橘子都已经腐烂
        return minute;
    }
};

总结

这道题的核心是 按分钟一层一层扩散。

这里用数字记录橘子的腐烂时间:

复制代码
1 = 新鲜橘子
2 = 初始腐烂橘子
3 = 第1分钟腐烂
4 = 第2分钟腐烂
5 = 第3分钟腐烂
...

所以:

复制代码
grid[i][j] == minute + 2

表示只让当前这一分钟应该扩散的腐烂橘子去感染上下左右的新鲜橘子。

两个变量重点记住:

复制代码
orange:当前还剩多少新鲜橘子
pre:这一轮扩散开始前的新鲜橘子数量

如果最后:

复制代码
orange > 0

说明传播已经停止,但还有新鲜橘子,因此:

复制代码
return -1;

一句话记忆:

每分钟找到当前层的腐烂橘子,向上下左右传播;全部腐烂返回分钟数,有橘子永远感染不到就返回 -1。

相关推荐
悠仁さん1 小时前
非类型模板参数的特化与偏特化
java·数据结构·算法
垆边人似月.2 小时前
最优河堤加固(二分答案 + 前缀和)
算法
171320330计算机毕设编程2 小时前
计算机毕业设计 基于Hadoop的新能源汽车发展前景分析 LW PPT
java·大数据·hadoop·python·算法·随机森林·线性回归
垆边人似月.2 小时前
幻兽防御战(贪心算法)
数据结构·算法
DongQiShanRen2 小时前
六根硬件映射(下):物理闭环五步法,抽一条已实装的看
大数据·jvm·人工智能·算法·rust·哈希算法·集成学习
Code_Solitude2 小时前
c语言:指针(3)+冒泡排序
java·c语言·算法
FPGA信号处理2 小时前
【模式识别】第四节课:支持向量机
算法·机器学习·支持向量机
ychqsq2 小时前
233.绽放
经验分享·职场和发展
碧海银沙音频科技研究院3 小时前
面向长尾音频分类的知识蒸馏研究
人工智能·算法·音视频
alphaTao3 小时前
LeetCode 每日一题 2026/10/12-2026/10/18
算法·leetcode