尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【一文搞懂多源 BFS 】 : LeetCode994. 腐烂的橘子
【LeetCode Hot 100】994. 腐烂的橘子一文搞懂多源 BFS大家好欢迎来到算法学习专栏。今天我们要聊的是力扣LeetCodeHot 100 中的一道经典题目——994. 腐烂的橘子。这道题是广度优先搜索BFS的经典应用特别是多源 BFS的典型代表。腐烂的橘子目录【LeetCode Hot 100】994. 腐烂的橘子一文搞懂多源 BFS 题目描述 思路分析什么是多源 BFS核心解题步骤代码实现复杂度分析 总结 题目描述在给定的m x n网格中每个单元格可以有以下三个值之一值0代表空单元格值1代表新鲜橘子值2代表腐烂的橘子。规则每分钟腐烂的橘子周围 4 个方向上相邻的新鲜橘子都会腐烂。要求返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能实现即最终还有新鲜橘子无法被腐烂则返回-1。 思路分析看到“每分钟向四周扩散”我们很容易联想到波的扩散过程。这种一层一层向外扩展的特性正是**广度优先搜索BFS**的拿手好戏。再看看这道题的题目要求返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。翻译一下实际上就是求腐烂橘子到所有新鲜橘子的最短路径。那么这道题使用 BFS应该是毫无疑问的了。什么是多源 BFS通常的 BFS 是从一个起点开始扩散。但在这道题中初始状态下可能有多个腐烂的橘子多个源头。怎么办呢很简单我们只需要在 BFS 开始前把所有初始状态为腐烂的橘子的坐标同时放入队列中。让它们作为第一层一起向外扩散这样就能保证所有新鲜橘子被感染的时间是最短且正确的。核心解题步骤统计与初始化遍历整个网格统计新鲜橘子的数量并将所有腐烂橘子的坐标放入队列。分层扩散按分钟计时只要队列不为空且还有新鲜橘子存在就进行循环。每次循环代表过了 1 分钟。我们需要记录当前队列的长度只处理当前这一层的橘子即这一分钟内会传染别人的橘子。对当前层的每个橘子检查其上、下、左、右四个方向。如果是新鲜橘子将其变成腐烂橘子新鲜橘子数量减一并把这个新腐烂的橘子加入队列等待下一分钟继续传染。当前层处理完后时间 1。判断结果队列为空时如果新鲜橘子数量为 0返回消耗的时间。如果新鲜橘子数量仍大于 0说明有些橘子被隔离了无法被传染返回-1。(注视频讲解中UP主口误说返回1实际力扣原题要求返回 -1大家在写代码时要注意哦)代码实现根据上面的思路我们可以写出如下代码以 Python 为例classSolution{// 上下左右四个方向privatestaticfinalint[][]DIRECTIONS{{-1,0},{1,0},{0,-1},{0,1}};publicintorangesRotting(int[][]grid){inttime0;// 经过的分钟数intfresh0;// 剩余新鲜橘子数量Queueint[]qnewArrayDeque();// 存放腐烂橘子坐标的队列// 1. 初始化统计新鲜橘子数量将所有腐烂橘子入队for(inti0;igrid.length;i){for(intj0;jgrid[0].length;j){inttempgrid[i][j];if(temp1){fresh;}elseif(temp2){q.offer(newint[]{i,j});}}}// 没有新鲜橘子直接返回 0if(fresh0){return0;}// 2. 多源 BFS每轮扩散一层对应一分钟while(!q.isEmpty()fresh0){intsizeq.size();time;// 处理当前层的所有腐烂橘子while(size--0){int[]tempq.poll();introwtemp[0];intcoltemp[1];// 向四个方向感染相邻的新鲜橘子for(intj0;j4;j){intnewRowrowDIRECTIONS[j][0];intnewColcolDIRECTIONS[j][1];// 越界或非新鲜橘子跳过if(newRow0||newRowgrid.length||newCol0||newColgrid[0].length||grid[newRow][newCol]!1){continue;}fresh--;grid[newRow][newCol]2;// 标记为腐烂q.offer(newint[]{newRow,newCol});// 入队下一轮继续扩散}}}// 3. 若新鲜橘子已全部腐烂返回时间否则返回 -1returnfresh0?time:-1;}}复杂度分析时间复杂度O ( m × n ) O(m \times n)O(m×n)。我们需要遍历整个网格一次来寻找初始状态BFS 过程中每个单元格最多被访问一次。空间复杂度O ( m × n ) O(m \times n)O(m×n)。最坏情况下网格中全是腐烂的橘子它们会同时被放入队列中。 总结“腐烂的橘子”是一道非常经典的 BFS 模板题。掌握这道题的关键在于理解多源 BFS的思想将多个起始点同时放入队列并利用分层遍历的特性来记录时间步数。只要遇到“最短时间、最少步数、层层扩散”之类的关键词第一时间想到广度优先搜索准没错
RELATED

相关推荐

NSK紧凑型大导程滚珠丝杠技术解析

NSK紧凑型大导程滚珠丝杠技术解析

型号 FSS2520N1D0600 属于 sources 中 NSK 专为主打高速、静音与紧凑(小型化)**紧凑型 FA 系列(FSS 型)滚珠丝杠,采用高响应的端部导流循环方式**。 与您前面查询的同轴径 10 mm 导程型号(FSS2510N1D0600&a…

📅 2026/10/15 12:56:28
阿里云微服务引擎 MSE 及 API 网关 2026 年 6 月产品动态

阿里云微服务引擎 MSE 及 API 网关 2026 年 6 月产品动态

点击此处,了解微服务引擎 MSE 产品详情。

📅 2026/10/18 5:40:28
合理用药系统的技术架构解析

合理用药系统的技术架构解析

一、系统整体技术架构 以慧药通合理用药系列产品为例,该平台采用四层分布式架构,从用户交互到数据存储形成完整的技术架构体系,通过中间件(API网关/ESB...)实现与HIS/EMR/LIS等系统集成,支持REST或WebServ…

📅 2026/10/15 6:59:09
MORE NEWS

更多资讯

📰

望江办证电工证值不值得考?怕考不过白交培训费的看这篇

望江办证电工证值不值得考?怕考不过白交培训费的看这篇 你怕电工证考不过,白交培训费?怕报名流程复杂,耽误正事?别急,这篇讲得都是望江办证电工证的真实干货,让你少走弯路,少花冤枉钱。…

📰

石家庄建筑电工证办理怕考不过白交培训费?郑州报考避坑指南全在这

石家庄建筑电工证办理怕考不过白交培训费?郑州报考避坑指南全在这 怕考不过白交培训费?石家庄建筑电工证办理不是谁都能搞定的,很多人报名后才发现,培训费花了,考试还是卡在那几道题上。别急,郑州报考避坑指南来了,这波操作不踩坑,考试一次过不是梦。…

📰

汾湖镇考电工证丢了怎么办?真实经历告诉你怎么补办

汾湖镇考电工证丢了怎么办?真实经历告诉你怎么补办 工地太忙根本没时间复习考试,这是很多电工在一线工作的痛点,尤其是像我这样的新人,刚从学校出来就进了工地,每天忙得连饭都顾不上吃,更别说抽空复习电工证考试了。但你知道吗?在郑州某建筑工地,就有…

📰

南靖电工证在哪里办内部消息全知道!找工作先拿证

南靖电工证在哪里办内部消息全知道!找工作先拿证 你现在正缺一个电工证,否则连面试机会都没有,对吧?南靖电工证在哪里办,这几乎是所有准备进工地、进工厂、进工地的电工最关心的问题。今天就给你透露几个 内部消息…

📰

考高压电工证的理论书怎么找?电子证书怎么用?外省证能不能转过来?

考高压电工证的理论书怎么找?电子证书怎么用?外省证能不能转过来? 之前考的证在外省能不能转过来?这是很多从业人员最关心的问题,尤其是像你这样在洛阳从事水利工程的朋友,经常在项目现场和不同城市之间来回跑。答案是: 可以转,但得按流程来…

📰

晋中特种工证件怎么考最划算 郑州报考避坑指南

晋中特种工证件怎么考最划算 郑州报考避坑指南 你是不是也正为找工作发愁?特种作业证成了很多行业求职的“硬门槛”,尤其是像建筑、制造、化工这些高危行业, 没有特种作业证就等于没资格上岗…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬