news 2026/6/2 1:15:25

力扣HOT100(48)图论-腐烂的橘子

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣HOT100(48)图论-腐烂的橘子

为什么必须用「多源 BFS」?

先想:如果只有一个腐烂橘子,怎么做?

这就是普通的单源 BFS:

  • 把初始腐烂橘子入队(第 0 层)
  • 每分钟处理队列里当前层的所有橘子,把它们相邻的新鲜橘子腐烂,作为下一层入队
  • 每处理完一层,时间加 1
  • 最后看有没有剩下的新鲜橘子

但题目里可能有多个初始腐烂橘子!

如果对每个腐烂橘子单独做一次 BFS,再取每个新鲜橘子的最小腐烂时间,时间复杂度会变成O(k*nm)(k 是初始腐烂橘子数),效率很低。

多源 BFS 的巧妙之处

所有初始腐烂橘子,都是 BFS 的第 0 层节点,同时入队!

  • 相当于所有腐烂橘子同时开始扩散
  • 一次遍历就能得到所有新鲜橘子的最短腐烂时间
  • 时间复杂度只有O(nm),和单源 BFS 一样

核心思路(一句话讲透)

把所有初始腐烂的橘子同时放进队列,然后像层序遍历一样,一层一层处理

  • 每一层对应一分钟
  • 处理当前层的所有腐烂橘子,把它们相邻的新鲜橘子腐烂,放进下一层
  • 最后如果还有新鲜橘子没被处理,返回-1,否则返回总层数(时间)
class Solution { public: int orangesRotting(vector<vector<int>>& grid) { int dx[4] = {-1,1,0,0}; int dy[4] = {0,0,-1,1}; int m = grid.size();//行数 int n = grid[0].size();//列数 int fresh = 0; int mins = 0; queue<pair<int,int>> q; for(int i = 0;i<m;i++){ for(int j = 0;j<n;j++){ if(grid[i][j] == 2){ q.push({i,j}); } else if(grid[i][j] == 1){ fresh++; } } } while(!q.empty()&& fresh>0){ //当q不为空且fresh新鲜数大于零 //有新鲜的就要腐烂 int size = q.size();//初始腐烂的个数 //往四个方向腐烂 for(int i = 0;i<size;i++){ //取出队首的坐标 int x = q.front().first; int y = q.front().second; q.pop(); //左方: if(y-1>=0 && grid[x][y-1] == 1 ){ //腐烂 grid[x][y-1] = 2; fresh--; q.push({x,y-1}); } //右方 if(y+1<n && grid[x][y+1] == 1){ grid[x][y+1] = 2; fresh--; q.push({x,y+1}); } //上方 if(x-1>=0&&grid[x-1][y] == 1){ grid[x-1][y] = 2; fresh--; q.push({x-1,y}); } //下方 if(x+1<m && grid[x+1][y] == 1){ grid[x+1][y] = 2; fresh--; q.push({x+1,y}); } } mins++; } return fresh == 0 ? mins : -1; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/2 1:11:55

Obsidian科研模板库:研究者的终极知识管理解决方案

Obsidian科研模板库&#xff1a;研究者的终极知识管理解决方案 【免费下载链接】obsidian_vault_template_for_researcher This is an vault template for researchers using obsidian. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian_vault_template_for_researcher…

作者头像 李华
网站建设 2026/6/2 1:11:54

BGP配置

需求&#xff1a;1、每个设备存在两个环回接口a.一个接口使用设备编号创建环回&#xff0c;掩码为32示例&#xff1a;R1的环回为1.1.1.1/32该环回用来建立BGP对等体关系或者作为BGP Router-ID使用 b.另一个环回接口使用设备编号创建&#xff0c;地址为192.168.X.0/24 示例&…

作者头像 李华
网站建设 2026/6/2 1:08:36

【AI图像生成工具采购决策框架】:技术负责人必读的5维评估模型(推理延迟/商用授权/私有化支持/微调成本/审计日志),已验证于8家A股上市公司

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;AI图像生成工具综合评测 近年来&#xff0c;AI图像生成工具在创意设计、营销素材制作与原型开发等领域展现出强大生产力。本章聚焦主流开源与商业工具的实际表现&#xff0c;从生成质量、可控性、本地部署可行…

作者头像 李华
网站建设 2026/6/2 1:06:53

深入Linux V4L2异步匹配机制:解决USB摄像头热插拔与多设备管理的那些坑

Linux V4L2异步匹配机制实战&#xff1a;多摄像头管理与热插拔难题破解在视频监控系统、视频会议终端以及需要同时接入多个摄像头的桌面应用中&#xff0c;开发者经常面临一个棘手问题&#xff1a;当系统连接多个USB摄像头或频繁进行热插拔操作时&#xff0c;/dev/video节点编号…

作者头像 李华
网站建设 2026/6/2 1:02:02

字节跳动面试全解析:算法与工程双核心

针对您关注的字节跳动面试&#xff0c;我将结合当前&#xff08;2026年&#xff09;的技术趋势与面试实践&#xff0c;进行系统性拆解与方案推演&#xff0c;为您提供一份详尽的面试攻略。 字节跳动&#xff08;ByteDance&#xff09;以其“追求极致、务实敢为”的文化著称&am…

作者头像 李华