一起学习LeetCode热题100道(52/100)

52.腐烂的橘子(学习)

在给定的 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 。

提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 10
grid[i][j] 仅为 0、1 或 2

解析:
一、初始化:
1.遍历整个网格,统计新鲜橘子的数量(freshOranges),并将所有腐烂橘子的坐标加入到一个队列(queue)中。
2.如果一开始就没有新鲜橘子(freshOranges === 0),则直接返回 0,因为没有橘子需要腐烂。

二、BFS 过程:
1.使用一个循环来执行 BFS,直到队列为空或没有新鲜橘子为止。
2.在每次循环中,处理当前队列中的所有腐烂橘子(即队列的当前层)。对于每个腐烂橘子,检查其四个方向上的相邻单元格:
3.如果相邻单元格是新鲜橘子(值为 1),则将其变为腐烂橘子(值为 2),并将其坐标加入队列中以便后续处理。
4.同时,将新鲜橘子的数量减一(freshOranges–)。
5.完成当前层的所有腐烂橘子的处理后,分钟数加一(minutes++),表示又过去了一分钟。

三、结果判断:
1.如果循环结束后,队列为空但仍有新鲜橘子(freshOranges > 0),则表示无法将所有新鲜橘子腐烂,返回 -1。
2.否则,返回分钟数 minutes,即直到网格中没有新鲜橘子为止所需的最小分钟数。

var orangesRotting = function (grid) {if (!grid.length || !grid[0].length) return 0;const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]; // 上下左右四个方向  const rows = grid.length;const cols = grid[0].length;let freshOranges = 0; // 记录新鲜橘子的数量  let queue = []; // 使用队列存储腐烂的橘子坐标  // 初始化队列,并统计新鲜橘子的数量  for (let i = 0; i < rows; i++) {for (let j = 0; j < cols; j++) {if (grid[i][j] === 1) {freshOranges++;} else if (grid[i][j] === 2) {queue.push([i, j]); // 将腐烂的橘子坐标加入队列  }}}if (freshOranges === 0) {// 如果没有新鲜橘子,则不需要任何时间  return 0;}let minutes = 0; // 记录分钟数  while (queue.length > 0 && freshOranges > 0) {const size = queue.length;for (let i = 0; i < size; i++) {const [row, col] = queue.shift(); // 取出队列中的一个腐烂橘子坐标  // 检查四个方向上的相邻单元格  for (const [dx, dy] of directions) {const newRow = row + dx;const newCol = col + dy;if (newRow >= 0 &&newRow < rows &&newCol >= 0 &&newCol < cols &&grid[newRow][newCol] === 1) {// 如果找到新鲜橘子,则将其变为腐烂的橘子,并加入到队列中  grid[newRow][newCol] = 2;queue.push([newRow, newCol]);freshOranges--; // 减少新鲜橘子的数量  }}}minutes++; // 每处理完一轮腐烂橘子,分钟数加1  }// 如果还有新鲜橘子剩下,则返回-1,否则返回分钟数  return freshOranges === 0 ? minutes : -1;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/406252.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP轻创推客集淘客地推任务平台于一体的综合营销平台系统源码

&#x1f680;轻创推客&#xff0c;营销新纪元 —— 集淘客与地推任务于一体的全能平台&#x1f310; &#x1f308;【开篇&#xff1a;营销新潮流&#xff0c;轻创推客引领未来】 在瞬息万变的营销世界里&#xff0c;你还在为寻找高效、全面的营销渠道而烦恼吗&#xff1f;&…

【数据安全】数据中心数据安全整体解决方案(Doc完整版)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏…

图数据库查询语言 Cypher 基础

Cypher 是 Neo4j 的声明式查询语言&#xff0c;为属性图提供了富有表现力和高效的查询&#xff0c;是一种成熟和直观的图数据库查询语言。在图上执行任何类型的创建、读取、更新或删除(CRUD)&#xff0c;Cypher 是 Neo4j 的主要接口。 本文介绍了 Cypher 基础知识&#xff0c;…

软件测试用例的编写(六)

软件测试用例 定义 测试用例&#xff08;TestCase&#xff09;是为项目需求而编制的一组测试输入&#xff0c;执行步骤&#xff0c;以及预期结果&#xff0c;以便测试某个程序是否满足客户需求 可以总结为&#xff1a;每一个测试点的数据设计和步骤设计 – 对测试点的细化 作…

大数据技术之Zookeeper安装 (2)

目录 下载地址 本地模式安装 1&#xff09;安装前准备 2&#xff09;配置修改 3&#xff09;操作 Zookeeper 配置参数解读 Zookeeper 集群操作 集群规划 解压安装 配置服务器编号 配置 zoo.cfg 文件 集群操作 Zookeeper 集群启动停止脚本 创建脚本 增加脚本执行权限 …

在线问诊平台开发指南:基于互联网医院系统源码的实现路径

今天&#xff0c;小编将详细讲解如何通过互联网医院系统源码开发在线问诊平台。 一、在线问诊平台的需求分析 在线问诊平的核心目标是通过互联网技术&#xff0c;实现患者与医生之间的远程交流与诊断。因此&#xff0c;在开发过程中&#xff0c;首先需要明确平台的核心功能需求…

将 hugo 博客搬迁到服务器

1. 说明 在 Ubuntu 22.04 上使用 root 账号&#xff0c;创建普通账号&#xff0c;并赋予 root 权限。 演示站点&#xff1a;https://woniu336.github.io/ 魔改hugo主题: https://github.com/woniu336/hugo-magic 2. 服务器配置 建立 git 用户 adduser git安装 git sudo apt …

SpringBoot笔记01

第1章 Spring Boot概要 1.1 SpringBoot介绍 随着动态语言的流行&#xff08;Ruby、Scala、Node.js&#xff09;, Java的开发显得格外的笨重&#xff1b;繁多的配置、低下的开 发效率、复杂的部署流程以及第三方技术整合难度大。 在上述环境下&#xff0c;Spring Boot由此诞生…

光伏检测气象站:实时监测:高效管理

随着全球对可再生能源需求的日益增长&#xff0c;光伏发电作为清洁能源的重要组成部分&#xff0c;其重要性日益凸显。然而&#xff0c;光伏发电的效率与稳定性受气象条件影响显著&#xff0c;如光照强度、温度、湿度、风速等因素均能直接影响光伏板的发电效率。因此&#xff0…

巧用PDF转Markdown插件,在扣子(Coze)手搓一个有趣好玩的AI Bot

近期&#xff0c;TextIn团队开发的PDF转Markdown插件已经上架Coze平台。 短短的时间内&#xff0c;已经有不少朋友愉快地和我们的工具开始玩耍。今天我们抛砖引玉&#xff0c;介&#xff08;an&#xff09;绍&#xff08;li&#xff09;几种PDF转Markdown插件的有趣玩法&#…

阅读、分析和维护高质量开源软件有感——小计一笔

目录 一、问题分析 软件开发问题分析 动机 学什么 目的 二、要求 阅读 理解 运用 分析 评估 认知 三、案例选择 MiNotes”开源软件 方式 实践支撑软件工具 操作流程 应该学到的知识 学习过程 四、任务与输出 1.阅读开源软件 2.标注开源软件 3.分析开源…

路径规划 | 灰狼算法+B样条曲线优化无人机三维路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 灰狼算法B样条曲线优化无人机三维路径规划&#xff08;Matlab&#xff09; 群智能路径规划算法。三维灰狼算法&#xff08;GWO&#xff09;加B样条曲线优化的matlab代码。无人机&#xff08;UAV&#xff09;路径规划…

二叉树剪枝

1、题目解析 2、算法解析 本题使用二叉树的后序遍历&#xff0c;通过递归函数将左右子树进行处理&#xff0c;得到处理结果后&#xff0c;判断左右结果以及自身的val判断是否需要剪枝。 3、代码编写 class Solution { public:TreeNode* pruneTree(TreeNode* root) {if(root …

SpringBoot项目多线程实现定时任务-只需要三步

众所周知&#xff0c;项目中需要使用定时任务发布的需求时非常常见的&#xff0c;例如&#xff1a;数据同步&#xff0c;清理垃圾文件&#xff0c;清理过期用户等需求&#xff0c;可能需要我们定时去清理数据。 但是我们如果集成xxl-job&#xff0c;Quartz&#xff0c;spring …

Leetcode每日刷题之1004.最大连续1的个数|||(C++)

1.题目解析 本题的目的是找出能最多翻转k个0的情况下最长连续的1的个数&#xff0c;并且这是一个二进制数组&#xff0c;只存在0和1&#xff0c;翻转0就是将0变为1 2.算法原理 首先我们想到的一定是暴力枚举&#xff0c;即依次列举出在最多翻转k个0的情况下所有连续1的子数组的…

odoo17 网站内容存在哪了

odoo17 网站内容存在哪了 查数据库内容&#xff0c;却没找到 没理解这些内容到底存在了哪里呢

从0-1建一个webpack/vue项目,熟悉一下webpack知识点

以下配置项部分优化来自于国内直连GPT/Claude 第一步 首先整个新文件夹&#xff0c;打开终端&#xff0c;然后创建一个新目录&#xff0c;或者直接在vscode里面建个新文件夹&#xff0c;并进入该目录&#xff1b; mkdir my-vue-webpack-project第二步 进入当前目录 cd my-v…

JavaSE基础(11)——java.util包

目录 1、Random 创建Random对象 方法 2、Date类 创建Date对象 3、Canlender类 创建Calendar类对象 方法 4、java.text.SimpleDateFormat类 创建SimpleDateFormat对象 方法 SimpleDateFormat格式规范 5、java.time包 java.time包含的主要类 方法分类 1、Rando…

Servlet---Web会话跟踪 ▎token令牌

▍为什么要进行Web会话跟踪? http请求是无状态的,不携带用户信息的,当用户登录成功后,之后在于服务器交互时,服务器并不知道是哪个用户发送的请求 ▍Web会话跟踪 解决方法:在用户成功登录后,后端向前端响应token令牌(token令牌:用户信息),前端保存token令牌每次访问后端都先…

赛氪网技术支持第八届集创赛全国总决赛:共绘集成电路创新蓝图

赛氪网技术支持第八届集创赛全国总决赛&#xff1a;共绘集成电路创新蓝图 山东&#xff0c;2024年8月19日至21日 —— 全国瞩目的第八届全国大学生集成电路创新创业大赛&#xff08;以下简称“集创赛”&#xff09;全国总决赛在美丽的海滨城市山东省烟台市隆重举行。本次大赛由…