LeetCode 994. 腐烂的橘子
题目描述给定一个m x n的网格grid每个单元格可能有三种值0表示空单元格。1表示新鲜橘子。2表示腐烂的橘子。每分钟腐烂的橘子会让上下左右四个方向相邻的新鲜橘子腐烂。要求返回直到没有新鲜橘子为止所需的最小分钟数。如果存在新鲜橘子永远无法腐烂返回-1。初始思路一开始容易想到 DFS从每个腐烂橘子出发去感染周围的新鲜橘子。但这个思路有一个关键问题题目里的腐烂过程是“每分钟同时扩散”而普通 DFS 更像是一条路径一直往深处走。DFS 不能自然表达“第 1 分钟腐烂哪些橘子第 2 分钟腐烂哪些橘子”。比如最开始写成“遇到腐烂橘子就把周围一圈新鲜橘子变腐烂”这其实只模拟了 1 分钟并没有继续分层扩散也没有正确统计答案。所以这题更适合使用多源 BFS。解题思路把网格看成一张图每个橘子格子可以看作一个节点。上下左右相邻表示节点之间有边。所有初始腐烂橘子2都是 BFS 的起点。因为一开始可能有多个腐烂橘子而且它们会同时向外扩散所以不能只从一个点开始 BFS而是要把所有初始腐烂橘子一起加入队列。这就是多源 BFS。具体流程遍历整个grid。遇到腐烂橘子2加入队列。遇到新鲜橘子1统计数量fresh。BFS 每次处理当前队列中的size个橘子。这一批橘子代表同一分钟内会继续扩散的腐烂橘子。如果感染到新鲜橘子就把它改成2同时fresh--再加入队列。BFS 结束后如果fresh 0说明所有新鲜橘子都腐烂了否则返回-1。为什么要按层 BFSBFS 中的“一层”正好对应题目中的“一分钟”。例如2 1 1 1 1 0 0 1 1第 1 分钟初始腐烂橘子影响周围2 2 1 2 1 0 0 1 1第 2 分钟新腐烂的橘子继续扩散2 2 2 2 2 0 0 1 1所以代码里需要先记录当前队列大小int size queue.size();然后只处理这size个元素。新加入队列的橘子不能在同一分钟继续扩散而是留到下一轮处理。易错点1. Java 数组入队写法Java 中不能这样写queue.add({i, j});应该写成queue.add(new int[]{i, j});因为{i, j}只能在数组初始化语境中使用不能单独作为一个对象传入方法。2. BFS 循环条件如果写成while (!queue.isEmpty()) { minutes; }答案可能会多 1。原因是最后一批刚刚腐烂的橘子还会留在队列里再被处理一轮。但这一轮已经没有新的新鲜橘子可以腐烂了不应该再增加分钟数。更稳妥的写法是while (!queue.isEmpty() fresh 0) { minutes; }只有在还存在新鲜橘子时继续按分钟扩散。3. 最后要判断是否还有新鲜橘子BFS 结束不代表所有新鲜橘子都腐烂了。如果某些新鲜橘子被空格隔开永远无法被腐烂橘子感染就需要返回-1。所以最后要根据fresh判断return fresh 0 ? minutes : -1;代码实现class Solution { int[][] D { { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } }; int m; int n; public int orangesRotting(int[][] grid) { m grid.length; n grid[0].length; Dequeint[] queue new ArrayDeque(); int fresh 0; int minutes 0; for (int i 0; i m; i) { for (int j 0; j n; j) { if (grid[i][j] 2) { queue.add(new int[]{i, j}); } else if (grid[i][j] 1) { fresh; } } } while (!queue.isEmpty() fresh 0) { int size queue.size(); minutes; for (int i 0; i size; i) { int[] cur queue.poll(); for (int[] d : D) { int x cur[0] d[0]; int y cur[1] d[1]; if (x 0 x m y 0 y n grid[x][y] 1) { grid[x][y] 2; fresh--; queue.add(new int[]{x, y}); } } } } return fresh 0 ? minutes : -1; } }复杂度分析时间复杂度O(m * n)。每个格子最多入队一次最多被检查一次。空间复杂度O(m * n)。最坏情况下队列中可能存放大量腐烂橘子。复盘这题的关键不是“会不会遍历四个方向”而是能不能看出它是一个按时间分层扩散的问题。当题目出现“每分钟”“同时扩散”“最短时间”这类描述时要优先考虑 BFS。并且如果一开始有多个源头比如多个腐烂橘子就要想到多源 BFS。下次写类似题时可以先检查三点是否把所有起点都加入队列而不是只从一个点开始。是否用size queue.size()区分每一分钟。是否用剩余数量fresh判断答案和-1。

相关新闻

3步搞定网易云插件安装:BetterNCM-Installer终极解决方案

3步搞定网易云插件安装:BetterNCM-Installer终极解决方案

3步搞定网易云插件安装:BetterNCM-Installer终极解决方案 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件安装而烦恼吗?手动复制文件、修改…

2026/10/19 23:20:34 阅读更多 →
# HarmonyOS ArkTS 数字时钟应用深度解析 —— 时针/分针/秒针旋转角度计算与定时器机制

# HarmonyOS ArkTS 数字时钟应用深度解析 —— 时针/分针/秒针旋转角度计算与定时器机制

一、应用概述 数字时钟(Digital Analog Clock)是智能设备上最经典的应用之一,它同时以数字形式和模拟表盘形式展示当前时间。本项目基于 HarmonyOS ArkTS 框架实现了一个功能完整的双模式时钟应用,包含数字时间显示(时…

2026/10/19 23:20:40 阅读更多 →
游戏音频提取完全指南:3步轻松解密ACB/AWB文件

游戏音频提取完全指南:3步轻松解密ACB/AWB文件

游戏音频提取完全指南:3步轻松解密ACB/AWB文件 【免费下载链接】acbDecrypter 项目地址: https://gitcode.com/gh_mirrors/ac/acbDecrypter 你是否曾想提取游戏中的背景音乐和音效,却苦于复杂的加密格式?acbDecrypter正是为你量身定制…

2026/10/19 23:20:46 阅读更多 →

最新新闻

从日榜看技术趋势:Rust崛起与AI应用层霸榜的深度拆解

从日榜看技术趋势:Rust崛起与AI应用层霸榜的深度拆解

1. 日榜项目的整体观察与拆解思路每天早上刷一遍热榜,已经成了我这些年做技术选型和趋势判断的固定动作。2026年10月8日这一期的日榜,整体看下来有一个很明显的特征:工具类项目占比超过六成,AI 应用层项目继续霸榜,但底…

2026/10/20 13:40:50 阅读更多 →
日榜速报:从开源趋势到技术选型的评估方法论

日榜速报:从开源趋势到技术选型的评估方法论

1. 日榜速报到底在解决什么信息焦虑每天早上打开代码托管平台,首页那个趋势榜单就像一份技术圈的晨报。但问题在于,榜单只给你一个仓库名和一句话简介,至于它为什么突然冲上来、背后用了什么技术栈、值不值得你花半小时去克隆下来跑一遍&…

2026/10/20 13:40:50 阅读更多 →
C++中变量进行初始化的3种方法

C++中变量进行初始化的3种方法

前言 「变量初始化有哪几种写法」这个问题,答案取决于你按什么维度分类。按语法形式分,最常说的是三种:复制初始化(copy-initialization,int a 1;)、直接初始化(direct-initialization&#xf…

2026/10/20 13:40:50 阅读更多 →
Serverpod客户端鸿蒙适配:端云屏障与序列化同步实战指南

Serverpod客户端鸿蒙适配:端云屏障与序列化同步实战指南

1. 为什么专门聊“Serverpod客户端的鸿蒙适配”1.1 Serverpod到底解决了什么问题这几年用 Flutter 做跨端业务,最舒服的一点就是 UI 层可以一套代码铺到手机、平板、桌面,甚至嵌入式设备。但等到真要对接后端的时候,很多人会突然发现一个问题…

2026/10/20 13:40:50 阅读更多 →
机器视觉框架实战:AOI检测与机械手定位引导全解析

机器视觉框架实战:AOI检测与机械手定位引导全解析

搞机器视觉的兄弟应该都有过这种经历:项目接下来,相机、镜头、光源选型好解决,真正的坑全在工程层。视觉检测模板要调,AOI缺陷检测要同时顶住误检和漏检两头压力,机械手定位要做手眼标定,一套流程捋下来&am…

2026/10/20 13:40:50 阅读更多 →
Kafka消息顺序性真相:从分区内有序到生产消费端全链路保序实践

Kafka消息顺序性真相:从分区内有序到生产消费端全链路保序实践

搞过分布式消息的同学应该都遇到过这类问题:明明往Kafka里发消息的时候还想着要顺序,等消费端一跑起来,订单状态直接被回滚回退,或者用户余额扣减顺序反了,一时半会又查不出问题在哪。我之前接手过一个订单系统&#x…

2026/10/20 13:39:46 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →