news 2026/9/14 23:08:06

【图论】LC 994.腐烂的橘子

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【图论】LC 994.腐烂的橘子

文章目录

  • 前言
  • 一、题目
    • 1、原题链接
    • 2、题目描述
  • 二、个人思路整理
    • 1、思路分析
    • 2、解题代码
  • 三、知识风暴

前言

本专栏文章为《LeetCode 热题 100》的刷题题解,相关内容如有侵权,立即删除。

一、题目

1、原题链接

994.腐烂的橘子

2、题目描述


二、个人思路整理

1、思路分析

核心方法是多源广度优先搜索

具体步骤:

  1. 多源起点:腐烂是同时从所有初始腐烂的橘子开始向四周扩散的。因此不能逐个进行单源搜索,而需要一开始就把所有初始为 2 的腐烂橘子坐标全部入队

  2. 统计新鲜橘子数量:在遍历网格初始化队列的同时,统计新鲜橘子(值为 1)的总数fresh_count
    若初始fresh_count == 0,直接返回0分钟。

  3. 按层扩散(BFS):

    • 每一轮循环代表过去 1 分钟。

    • 记录当前队列的大小size,依次弹出这批橘子,向上下左右 4 个方向扩散。

    • 若相邻位置是新鲜橘子(值为 1):

      • 将其置为腐烂(改成 2,避免重复入队)。

      • fresh_count--

      • 将新腐烂的橘子坐标加入队列。

    • 只有当本轮确实腐烂了新的橘子时(即fresh_count > 0且队列非空),经过的分钟数minutes才累加。

  4. 结果判定:

    • BFS 结束后,若fresh_count == 0,说明全部腐烂,返回minutes

    • fresh_count > 0,说明有新鲜橘子被隔绝无法腐烂,返回-1

2、解题代码

classSolution{public:intorangesRotting(vector<vector<int>>&grid){intm=grid.size();intn=grid[0].size();intfresh_count=0;queue<pair<int,int>>q;// 1. 初始化:收集所有腐烂橘子入队,并统计新鲜橘子个数for(inti=0;i<m;i++){for(intj=0;j<n;j++){if(grid[i][j]==2){q.push({i,j});}if(grid[i][j]==1){fresh_count++;}}}// 初始就没有新鲜橘子,直接耗时 0if(fresh_count==0){return0;}intminutes=0;intdx[4]={-1,1,0,0};intdy[4]={0,0,-1,1};// 2. 多源 BFS 按层扩散while(!q.empty()&&fresh_count>0){intsize=q.size();minutes++;// 每一层代表1分钟for(intk=0;k<size;k++){auto[x,y]=q.front();q.pop();for(intd=0;d<4;d++){intnx=x+dx[d];intny=y+dy[d];// 越界或不是新鲜橘子则跳过if(nx>=0&&nx<m&&ny>=0&&ny<n&&grid[nx][ny]==1){grid[nx][ny]=2;// 标记为已腐烂,防止重复访问fresh_count--;q.push({nx,ny});}}}}// 3. 判断是否还有未被感染的新鲜橘子returnfresh_count==0?minutes:-1;}};

复杂度分析

  • 时间复杂度:O ( m × n ) O(m \times n)O(m×n)。每个单元格最多被访问和入队常数次。
  • 空间复杂度:O ( m × n ) O(m \times n)O(m×n)。队列中最多同时存放O ( m × n ) O(m \times n)O(m×n)个坐标。

三、知识风暴

多源广度优先搜索(Multi-source BFS)是本题的核心解法。与单源 BFS 不同,本题的腐烂过程是同时从所有初始腐烂的橘子开始的,因此需要把所有腐烂橘子作为起点统一入队,再按层向外扩散。理解多源 BFS 的分层思想,对掌握本题至关重要。

算法核心思想

  • 多源起点:腐烂是同时发生的,不能逐个进行单源搜索,而应一开始就把所有初始为 2 的腐烂橘子坐标全部入队,让它们在同一时刻向四周扩散。
  • 按层扩散:每一轮循环代表过去 1 分钟。记录当前队列大小size,只弹出这一批橘子,向上下左右 4 个方向扩散,保证“分钟数”与“层数”一一对应。
  • 原地标记:把新鲜橘子置为 2(腐烂),既避免重复入队,又省去了额外的visited数组,空间复杂度更优。

常见对比:单源 BFS vs 多源 BFS

  • 单源 BFS:从一个起点出发,求到其他点的最短距离,队列初始只有一个元素。
  • 多源 BFS:从多个起点同时出发,求“所有起点到目标点的最短距离”,队列初始包含所有起点。本题中,所有腐烂橘子同时扩散,天然契合多源 BFS 模型。
  • 共同点:两者都借助队列按层遍历,区别仅在于初始入队的节点数量。多源 BFS 可看作“虚拟超级源点”连接所有起点后的单源 BFS。

“按层扩散”标记思想

  • 核心思想:每一轮循环只处理当前队列中的节点(即同一分钟新腐烂的橘子),通过size变量固定本轮范围,避免把下一分钟才腐烂的橘子混入本轮计数。
  • 与本题的联系:每经过一轮循环,minutes加 1,代表又过去 1 分钟。只有本轮确实腐烂了新的橘子(fresh_count > 0且队列非空),分钟数才累加。
  • 注意事项:若在 BFS 过程中直接修改grid为 2,需确保不会把“本轮新腐烂”的橘子当作“下一轮起点”重复扩散——这正是按层处理(先记录size)的意义所在。

使用要点

  • 方向数组:用int dx[4] = {-1, 1, 0, 0}; int dy[4] = {0, 0, -1, 1};统一表示上下左右四个方向,配合循环遍历,可避免重复书写四行扩散逻辑。
  • 边界检查:扩散前务必判断行列下标是否越界,以及当前格子是否为新鲜橘子(值为 1),这是防止重复访问和越界的关键。
  • 计数时机:新鲜橘子计数器fresh_count--必须放在“发现新鲜橘子并置为腐烂”的瞬间,同时入队,保证每个橘子只被感染一次。
  • 结果判定:BFS 结束后,若fresh_count == 0说明全部腐烂,返回minutes;若仍有剩余,说明有新鲜橘子被隔绝,返回-1

算法变体与扩展

  • 岛屿数量(LeetCode 200):单源 DFS/BFS 遍历连通分量,与本题的多源 BFS 形成对比,可体会“单源 vs 多源”的差异。
  • 被围绕的区域(LeetCode 130):从边界出发标记不被包围的'O',再翻转其余'O',是“从边界反向搜索”的经典应用。
  • 太平洋大西洋水流问题(LeetCode 417):从边界反向 DFS,标记能到达两个海洋的格子,进一步体会“逆向搜索”思想。
  • 地图分析(LeetCode 1162):多源 BFS 求“离所有陆地最远的海洋”,与本题同属多源 BFS 的典型应用,可加深对分层遍历的理解。

相关 LeetCode 例题

  • 200. 岛屿数量(单源 DFS/BFS 统计连通块)
  • 130. 被围绕的区域(边界反向搜索)
  • 417. 太平洋大西洋水流问题(多源逆向 DFS)
  • 1162. 地图分析(多源 BFS 分层扩散)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 23:07:20

.NET与Java开发者体验对比:语法、工具与生态差异

1. 项目概述&#xff1a;.NET与Java的开发者体验差异作为一名在.NET和Java双栈都有五年以上开发经验的工程师&#xff0c;我经常在技术社区看到.NET开发者转向Java时的各种"吐槽"。这些抱怨并非空穴来风&#xff0c;而是源于两种技术栈在设计哲学、开发体验和生态系统…

作者头像 李华
网站建设 2026/9/14 23:06:56

科技行业三大趋势:跨界扩张、治理合规与订阅经济

1. 科技行业动态深度解析&#xff1a;从美团跨界到特斯拉订阅制最近科技圈几件大事值得从业者关注&#xff1a;美团跨界卖车、迅雷与前CEO的法律纠纷、特斯拉FSD订阅制改革。这些看似独立的事件&#xff0c;实际上反映了科技行业正在经历的三个重要趋势——业务边界模糊化、公司…

作者头像 李华
网站建设 2026/9/14 23:06:51

双向接触器HESG446933R0002解析与应用指南

1. HESG446933R0002 70AB02B-E双向接触器解析在工业控制领域&#xff0c;接触器作为电气自动化系统的核心元件&#xff0c;其性能直接影响设备运行的可靠性和安全性。今天要拆解的这款HESG446933R0002 70AB02B-E双向接触器&#xff0c;是专为高负载切换场景设计的机电一体化组件…

作者头像 李华
网站建设 2026/9/14 23:05:10

用户数据安全:撤回同意与账户注销的隐患与防护

1. 项目概述&#xff1a;撤回同意与账户注销的隐秘战场在用户数据权益保护日益严格的今天&#xff0c;"撤回同意"与"账户注销"功能已成为互联网产品的标配。但这两个看似简单的功能背后&#xff0c;隐藏着大量鲜为人知的安全隐患。去年某社交平台就因注销逻…

作者头像 李华
网站建设 2026/9/14 23:05:09

本科生论文AI率检测工具测评与避坑指南

1. 项目概述&#xff1a;为什么本科生需要关注降AI率工具&#xff1f;最近在学术圈里有个现象特别有意思&#xff1a;越来越多本科生开始关注论文查重之外的另一个指标——AI率。去年帮学弟改论文时&#xff0c;他拿着某平台的检测报告急得直跳脚&#xff1a;"学长&#x…

作者头像 李华