当前位置: 首页 > news >正文

052腐烂的橘子

腐烂的橘子题目链接https://leetcode.cn/problems/rotting-oranges/description/?envTypestudy-plan-v2envIdtop-100-liked我的解答public int orangesRotting(int[][] grid) { int m grid.length, n grid[0].length; QueueInteger decayed new LinkedList();//记录腐烂的橘子的位置 int[][] directions new int[][]{{-1,0}, {1,0}, {0,-1}, {0,1}}; int freshNum 0;//新鲜橘子的个数 int ans 0; for(int i0; im; i){ for(int j0; jn; j){ if(grid[i][j] 1){ freshNum; } else if(grid[i][j] 2){ decayed.add(i * n j); } } } while(!decayed.isEmpty()){ if(freshNum 0){ break; } int size decayed.size(); while(size 0){ int index decayed.remove(); size--; int row index / n; int col index % n; for(int i0; i4; i){ row directions[i][0]; col directions[i][1]; if(row0 rowm col0 coln grid[row][col] 1){ grid[row][col] 2; freshNum--; decayed.add(row * n col); } row - directions[i][0]; col - directions[i][1]; } } ans; } return freshNum 0 ? ans : -1; }分析代码的时间复杂度为O(mn)空间复杂度为O(mn)。解题思路采用广度优先搜索。先遍历一遍grid统计出新鲜橘子的个数同时把腐烂橘子的位置加入队列然后对队列中腐烂的橘子用广搜进行拓展每次拓展到一个新鲜橘子就让新鲜的橘子变为腐烂的橘子并让新鲜的橘子数量减一直到队列为空或没有新鲜橘子为止最终根据新鲜橘子的数量返回答案。看了官方题解后的解答int[] dr new int[]{-1, 0, 1, 0}; int[] dc new int[]{0, -1, 0, 1}; public int orangesRotting(int[][] grid) { int R grid.length, C grid[0].length; QueueInteger queue new ArrayDequeInteger(); MapInteger, Integer depth new HashMapInteger, Integer(); for (int r 0; r R; r) { for (int c 0; c C; c) { if (grid[r][c] 2) { int code r * C c; queue.add(code); depth.put(code, 0); } } } int ans 0; while (!queue.isEmpty()) { int code queue.remove(); int r code / C, c code % C; for (int k 0; k 4; k) { int nr r dr[k]; int nc c dc[k]; if (0 nr nr R 0 nc nc C grid[nr][nc] 1) { grid[nr][nc] 2; int ncode nr * C nc; queue.add(ncode); depth.put(ncode, depth.get(code) 1); ans depth.get(ncode); } } } for (int[] row: grid) { for (int v: row) { if (v 1) { return -1; } } } return ans; }分析​ 1、上方直接粘贴了官方版本的解答。官方题解只有一种解法即“多源广度优先搜索”。解题思路与我的解答一致只是实现上有所差别。具体差别在于​ 第一对于在四个方向上的移动我选择采用二维数组而官方题解采用两个一维数组分别控制水平方向上的移动和垂直方向上的移动​ 第二我直接利用一个变量维护广搜的层数而官方题解采用哈希表将层数信息与每个腐烂的橘子绑定在某些需要回溯或记录每个节点状态的场景下会更有优势​ 第三我最初遍历grid时统计了新鲜橘子的数量最后根据新鲜橘子的数量情况返回答案而官方题解采用最后重新遍历一遍grid判断是否还有新鲜橘子来返回答案​ 第四官方题解采用ArrayDeque作为队列效率优于LinkedList。总结本题主要需要掌握“多源广度优先搜索”记录拓展的层数即可。
http://www.rkmt.cn/news/1308282.html

相关文章:

  • 首次使用Taotoken Token Plan套餐的计费与用量体验
  • 轻量级数据转发工具fwd2claw:解决系统间数据格式与协议鸿沟
  • 5G NR网络优化实战:手把手教你读懂PHR报告,精准定位上行功率问题
  • 终极指南:FanControl风扇控制软件完全配置教程
  • Llama3免费API实战:从零集成到商业变现的完整指南
  • CSerialPort库在MFC项目中集成时,你最容易踩的3个坑(附VS2008/2019解决方案)
  • Agent 工程化系列 · 第 13 篇_Agent安全与可靠性如何保障
  • 告别手动!用Allegro Testprep脚本批量处理测试点,效率提升200%
  • Kubernetes轻量级服务网格Cetus:核心流量治理与Sidecar代理实践
  • 3个维度深度解析:如何用HunterPie重构你的《怪物猎人:世界》数据驱动体验
  • LAMMPS效率翻倍秘籍:从单机到并行,你的MPICH配置真的对了吗?
  • 2026年东戴河大馅海鲜特色菜餐厅口碑排行,第一名出乎意料
  • 安卓端最强下载器 Seal:是神器还是“鸡肋”?教你暴力调教
  • 猫抓cat-catch浏览器扩展:零基础掌握网页视频音频捕获技术
  • 开源项目贡献指南:我的第一次PR提交经历
  • 在西安莲湖区看牙的真实体验记录
  • Unity 2D横版游戏实战:从零搭建一个像素风闯关游戏(含完整源码与素材)
  • 键盘连击修复神器:彻底解决机械键盘重复按键问题
  • VisualCppRedist AIO:一站式解决Windows软件运行库缺失问题
  • 【NotebookLM文档推荐黑科技】:20年AI架构师亲授相似文档匹配的5大隐藏参数调优法
  • 如何彻底清理显卡驱动:提升系统性能的终极指南
  • 如何构建自己的世界模型:三步方法
  • OpenHands:开源AI双手操作框架,从仿真到现实的具身智能实践
  • LCD段码屏真值表转换:从原理到C语言实现详解
  • 10㎡餐饮小厨房设计:高效布局与明暗沟选择
  • GitHub awesome-ai-apps项目:AI应用导航与高效选型指南
  • QrScan:如何快速批量识别图片中的二维码?完整使用指南
  • 各种遍历算法之二叉树的最大深度
  • Coder:基于Terraform的云端开发环境即代码平台实践
  • 从模板配置到静默输出:基于Electron+Vue的Grid++Report与C-Lodop打印方案深度实践