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

力扣题/图论/腐烂的橘子

腐烂的橘子

力扣原题

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

0 代表空单元格;
1 代表新鲜橘子;
2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1

示例 1:
在这里插入图片描述

输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4

示例 2:

输入:grid = [[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。

示例 3:

输入:grid = [[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

/*** @param {number[][]} grid* @return {number}*/
var orangesRotting = function(grid) {const queue = [] // 腐烂橘子队列, 每一个个item定义为 [行, 列, 腐烂时间]const m = grid.lengthconst n = grid[0].lengthlet freshCount = 0;// 初始化,收集所有腐烂橘子,放入队列中 ,并记录健康橘子总数for(let i = 0; i < m; i++) {for(let j = 0; j < n; j++) {if(grid[i][j] === 2) {queue.push([i, j, 0]) // 定义 [行, 列, 腐烂时间]} else if(grid[i][j] === 1) {freshCount += 1}}}let minMinutes = 0while(queue.length) {const [row, col, minute] = queue.shift()// 当前腐烂上下左右未腐烂的橘子,设置为下一分钟腐烂if(row > 0 && grid[row-1][col] === 1) {grid[row-1][col] = 2 // 设置为腐烂,避免重复计算queue.push([row-1, col, minute + 1])minMinutes = minute + 1 // 更新腐烂最短时长freshCount -= 1 // 新鲜橘子数量-1}if(row < m - 1 && grid[row+1][col] === 1) {grid[row+1][col] = 2queue.push([row+1, col, minute + 1])minMinutes = minute + 1freshCount -= 1}if(col > 0 && grid[row][col-1] === 1) {grid[row][col-1] = 2queue.push([row, col-1, minute + 1])minMinutes = minute + 1freshCount -= 1}if(col < n - 1 && grid[row][col+1] === 1) {grid[row][col+1] = 2queue.push([row, col+1, minute + 1])minMinutes = minute + 1freshCount -= 1}}return freshCount ? -1 : minMinutes};

解题思路

  1. 先遍历grid获取到新鲜橘子数量腐烂橘子位置
  2. 腐烂橘子位置放进队列里,每次取队列头部的数据,就能保证一定是当前先腐烂的橘子
  3. 数据中有当前腐烂橘子的行、列、第几分钟腐烂的信息,找其上下左右位置未腐烂的橘子,将其设置为已腐烂,并定义为当前橘子腐烂分钟数+1,将行列数据和新的腐烂分钟数推入队尾,同时新鲜橘子数-1。队列一定是遍历先腐烂的橘子的,所以最小腐烂时间+1
  4. 队列为空时,则说明已经没有可以腐烂的橘子了,如果当前新鲜橘子还有,则返回-1,否则才可返回最小分钟数

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • VueX 使用
  • selenium 9222
  • ClickHouse集群的安装
  • 【C++指南】深入剖析:C++中的引用
  • 【大数据平台】数据存储、处理与分析
  • vue2子传值给父组件
  • 绘唐TK小说推文工具,聚星小说推文一键生成工具
  • nvidia jetson 系列开发板交叉编译方法,CUDA依赖程序
  • 免费分享:1900-2023中国大都市群自然灾害数据(附下载方式)
  • C语言:链表插入
  • qiankun微前端
  • 【MySQL进阶之路】表结构的操作
  • live2d + edge-tts 优雅的实现数字人讲话 ~
  • 【在线+sdwebui】在线免费运行stable-diffusion-webui (无需配置环境)
  • 组件间通信高级
  • docker python 配置
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaWeb(学习笔记二)
  • Java精华积累:初学者都应该搞懂的问题
  • Meteor的表单提交:Form
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Octave 入门
  • Python连接Oracle
  • Vue全家桶实现一个Web App
  • windows-nginx-https-本地配置
  • 不上全站https的网站你们就等着被恶心死吧
  • 京东美团研发面经
  • 前端相关框架总和
  • -- 数据结构 顺序表 --Java
  • 微信小程序设置上一页数据
  • 写代码的正确姿势
  • 异步
  • FaaS 的简单实践
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 整理一些计算机基础知识!
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #define
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (3)选择元素——(17)练习(Exercises)
  • (floyd+补集) poj 3275
  • (ibm)Java 语言的 XPath API
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一) springboot详细介绍
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)关于pipe()的详细解析
  • .htaccess配置重写url引擎
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net Signalr 使用笔记
  • .net SqlSugarHelper
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • .NET多线程执行函数
  • .net分布式压力测试工具(Beetle.DT)
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • ??在JSP中,java和JavaScript如何交互?
  • @AutoConfigurationPackage的使用