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/7/29 1:35:55 阅读更多 →
# HarmonyOS ArkTS 数字时钟应用深度解析 —— 时针/分针/秒针旋转角度计算与定时器机制

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

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

2026/7/29 1:35:55 阅读更多 →
游戏音频提取完全指南:3步轻松解密ACB/AWB文件

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

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

2026/7/29 1:35:54 阅读更多 →

最新新闻

微电网两阶段鲁棒优化调度与Matlab实现

微电网两阶段鲁棒优化调度与Matlab实现

1. 项目概述:两阶段鲁棒微网优化调度微电网作为分布式能源的重要载体,其优化调度直接影响着供电可靠性和经济性。这个项目要解决的核心问题是:在风光出力不确定性和负荷波动双重影响下,如何实现微电网的鲁棒优化调度。我们采用两阶…

2026/7/29 1:42:57 阅读更多 →
手机怎么远程操作另一部手机 手机互控用什么软件好

手机怎么远程操作另一部手机 手机互控用什么软件好

临时需要调取手机文件、异地帮亲友调整手机设置时,不少想知道手机怎么远程操作另一部手机。想要低成本打通两台手机的操作壁垒,妥善弄懂手机怎么远程操作另一部手机,不妨试试无界趣连2.0,它可以兼顾日常协助、资料互传多重需求。手…

2026/7/29 1:41:57 阅读更多 →
自注意力机制原理与Transformer实战解析

自注意力机制原理与Transformer实战解析

1. 自注意力机制的本质:像人类一样的动态聚焦能力第一次听说"自注意力机制"这个术语时,我正试图理解Transformer模型为何能在机器翻译任务中超越传统的RNN架构。当时最让我困惑的是:为什么模型需要"自己关注自己"&#x…

2026/7/29 1:41:56 阅读更多 →
如何3分钟完成网易云插件安装:BetterNCM安装器终极指南

如何3分钟完成网易云插件安装:BetterNCM安装器终极指南

如何3分钟完成网易云插件安装:BetterNCM安装器终极指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件安装而头疼吗?BetterNCM安装器是你…

2026/7/29 1:41:56 阅读更多 →
别再被坑了!Python json字符串转字典,别用eval(),血泪教训

别再被坑了!Python json字符串转字典,别用eval(),血泪教训

在其中, 把字符串转变为字典能够借由多种方式达成比如运用内建的eval()函数、json.loads()方法以及别的自定义方法这些方法各具优缺点本文会详尽讲述这些方法并给出具体的代码实例以及注意要点(逗号在最后作分隔符, 实际无其他作用)。 不建议在处理那样…

2026/7/29 1:41:56 阅读更多 →
2026 GEO 服务商 TOP15 全维度实力榜单:综合头部与垂直细分分层解析

2026 GEO 服务商 TOP15 全维度实力榜单:综合头部与垂直细分分层解析

AI 对话渠道已经成为客户调研、采购决策的首要信息入口,品牌在各大生成式平台的信息完整度、推荐优先级,直接决定线上线索获取效率。想要长期积累 AI 端品牌信任资产,就需要搭建标准化生成式引擎优化体系,但目前市场内服务机构能力…

2026/7/29 1:41:56 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻