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。

相关推荐
vivo互联网技术2 分钟前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户0441440924494 分钟前
卫星信号模拟器里的四个坐标转换公式
算法
橘和柠14 分钟前
阿里 open-code-review (AI代码审查工具)实战:安装、四层规则链、自定义规则格式与实测避坑
算法·面试
得物技术15 分钟前
别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?
人工智能·算法·llm
罗西的思考15 分钟前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(4)--- Rollout实现细节
人工智能·算法
罗西的思考26 分钟前
机器人 / 物理 Agent Harness 综合分析与对比:从「更强的模型」到「更好的系统」
人工智能·算法·机器学习
库玛西27 分钟前
攻克 408 数据结构:图论基石深度拆解(数学极值推演 + 存储内存剖析 + BFS/DFS 双核模板)
数据结构·算法·深度优先·广度优先·图搜索算法
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习