LeetCode 热题 100_腐烂的橘子(52_994_中等_C++)(图;广度优先遍历(队列))
LeetCode 热题 100_腐烂的橘子(52_994)
- 题目描述:
- 输入输出样例:
- 题解:
- 解题思路:
- 思路一(广度优先遍历(队列)):
- 代码实现
- 代码实现(思路一(广度优先遍历(队列))):
- 以思路一为例进行调试
- 部分代码解读
题目描述:
在给定的 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、从柿子腐烂的过程,可以容易的想到腐烂是从坏柿子为中心开始一圈一圈向外进行蔓延。每个柿子为一个腐烂的中心,同时进行腐烂。容易想到每个腐烂的橘子为中心同时进行广度优先遍历,将好柿子变为坏柿子。
2、具体思路如下:
① 一开始遍历整个网格,将所有腐烂的柿子入队(并统计好柿子的数量,如果好柿子的数量为0则返回时间0)。
② 统计此时队列中腐烂柿子的数量n0。
③ 将n0个腐烂柿子出队,并将其上下左右好柿子入队,入队时将其变为腐烂的柿子。
④ 此时将时间(time)+1,并更新剩余好柿子数量(好柿子-新腐烂的柿子)。
⑤ 统计此时队列中腐烂柿子的数量n1。
⑥ 将n1个腐烂柿子出队,并将其上下左右好柿子入队,入队时将其变为腐烂的柿子。
⑦ 此时将时间(time)+1,并更新剩余好柿子数量(好柿子-新腐烂的柿子)。
…
…
…
重复上述过程,直至队列为空为止。
⑧ 如果好柿子的数量>0,则输出-1。如果好柿子的数量=0,则输出时间(time)。
3、复杂度分析:
① 时间复杂度:O(mn),其中 n,m 分别为 grid 的行数与列数,先对网格的坏橘子入队,统计好橘子的数量O(mn)。再进行一次广度优先搜索的时间O(mn)。
② 空间复杂度:O(m+n),主要取决于栈的深度,最坏情况为m=n时,中心的一个为坏橘子,栈中元素最多为最外层的数量(2m+2n)。
代码实现
代码实现(思路一(广度优先遍历(队列))):
int orangesRotting(vector<vector<int>>& grid) {//网格的行和列int r_size=grid.size(),c_size=grid[0].size();//好柿子的数量int nums_goodOrange=0;//最小分钟数int time=0;//存放腐烂句子的队列queue<pair<int,int>> Q;//遍历网格统计好橘子的数量,并将坏橘子入队(进行后续的广度优先遍历)for (int r = 0; r < r_size; r++){for (int c = 0; c < c_size; c++){//坏柿子入队if (grid[r][c]==2){Q.push({r,c});//统计好柿子数量}else if(grid[r][c]==1){nums_goodOrange+=1;}}}//如果好橘子的数量为0则之间返回0if (nums_goodOrange==0) return 0;//注意我们队列中一开始会存储坏橘子的数量,所以我们在这里加上,便于我们后续统计好橘子转换为坏橘子的数量nums_goodOrange+=Q.size();while (!Q.empty()){//“一层”坏橘子的数量int n=Q.size();//将n0个腐烂柿子出队,并将其上下左右好柿子入队,入队时将其变为腐烂的柿子//此时将时间(time)+1,并更新剩余好柿子数量(好柿子-新腐烂的柿子)。for (int i = 0; i < n; i++){auto rc= Q.front();Q.pop();int r=rc.first,c=rc.second;//处理坏柿子紧挨着上下左右的好柿子if (r-1>=0 && grid[r-1][c]==1){grid[r-1][c]=2;Q.push({r-1,c});}if (r+1<r_size && grid[r+1][c]==1){grid[r+1][c]=2;Q.push({r+1,c});}if (c-1>=0 && grid[r][c-1]==1){grid[r][c-1]=2;Q.push({r,c-1});}if (c+1<c_size && grid[r][c+1]==1){grid[r][c+1]=2;Q.push({r,c+1});}}//新腐烂一层柿子后time+1,更新好柿子的数量++time;nums_goodOrange-=n;}if (nums_goodOrange>0){return -1;}//注意一开始我们统计了一次,最开始就是腐烂的坏柿子,所以要减去return time-1;
}
以思路一为例进行调试
#include<iostream>
#include <vector>
#include<queue>
using namespace std;class Solution {
public:int orangesRotting(vector<vector<int>>& grid) {//网格的行和列int r_size=grid.size(),c_size=grid[0].size();//好柿子的数量int nums_goodOrange=0;//最小分钟数int time=0;//存放腐烂句子的队列queue<pair<int,int>> Q;//遍历网格统计好橘子的数量,并将坏橘子入队(进行后续的广度优先遍历)for (int r = 0; r < r_size; r++){for (int c = 0; c < c_size; c++){//坏柿子入队if (grid[r][c]==2){Q.push({r,c});//统计好柿子数量}else if(grid[r][c]==1){nums_goodOrange+=1;}}}//如果好橘子的数量为0则之间返回0if (nums_goodOrange==0) return 0;//注意我们队列中一开始会存储坏橘子的数量,所以我们在这里加上,便于我们后续统计好橘子转换为坏橘子的数量nums_goodOrange+=Q.size();while (!Q.empty()){//“一层”坏橘子的数量int n=Q.size();//将n0个腐烂柿子出队,并将其上下左右好柿子入队,入队时将其变为腐烂的柿子//此时将时间(time)+1,并更新剩余好柿子数量(好柿子-新腐烂的柿子)。for (int i = 0; i < n; i++){auto rc= Q.front();Q.pop();int r=rc.first,c=rc.second;//处理坏柿子紧挨着上下左右的好柿子if (r-1>=0 && grid[r-1][c]==1){grid[r-1][c]=2;Q.push({r-1,c});}if (r+1<r_size && grid[r+1][c]==1){grid[r+1][c]=2;Q.push({r+1,c});}if (c-1>=0 && grid[r][c-1]==1){grid[r][c-1]=2;Q.push({r,c-1});}if (c+1<c_size && grid[r][c+1]==1){grid[r][c+1]=2;Q.push({r,c+1});}}//新腐烂一层柿子后time+1,更新好柿子的数量++time;nums_goodOrange-=n;}if (nums_goodOrange>0){return -1;}//注意一开始我们统计了一次,最开始就是腐烂的坏柿子,所以要减去return time-1;}
};int main(int argc, char const *argv[])
{vector<vector<int>> grid={{2,1,1},{0,1,1},{1,0,1}};//统计腐烂柿子的数量并输出Solution s;cout<<s.orangesRotting(grid);return 0;
}
部分代码解读
pair<int,int>的解读请点击此链接:(LeetCode 热题 100_岛屿数量(51_200_中等_C++)(图;深度优先遍历;广度优先搜索)(pair<int,int>)
LeetCode 热题 100_腐烂的橘子(52_994)原题链接
欢迎大家和我沟通交流(✿◠‿◠)
相关文章:
LeetCode 热题 100_腐烂的橘子(52_994_中等_C++)(图;广度优先遍历(队列))
LeetCode 热题 100_腐烂的橘子(52_994) 题目描述:输入输出样例:题解:解题思路:思路一(广度优先遍历(队列)): 代码实现代码实现(思路一…...
Nginx 可观测性最佳实践
Nginx 介绍 Nginx 是一个开源、轻量级、高性能的 HTTP 和反向代理服务器,也可以用于 IMAP/POP3 代理服务器。Nginx 因其采用的异步非阻塞工作模型,使其具备高并发、低资源消耗的特性。高度模块化设计也使得 Nginx 具备很好的扩展性,在处理静…...
LabVIEW光流跟踪算法
1. 光流跟踪算法的概述 光流(Optical Flow)是一种图像处理技术,用于估算图像中像素点的运动。通过比较连续帧图像,光流算法可以分析图像中的运动信息,广泛用于目标跟踪、运动检测和视频处理等场景。该示例使用了NI Vi…...
Jira用例自动去除summary重复用例
title: Jira用例自动去除summary重复用例 tags: - jira - python categories: - python一、背景与需求二、解决方案思路三、实施步骤本文永久更新地址: 在使用 Jira 进行项目管理时,测试用例的维护至关重要。随着项目推进,用例数量增多,可能…...
基于openEuler22.03SP4部署Prometheus+Grafana
测试环境 Virtual Box,openEuler-22.03-LTS-SP4-x86_64-dvd.iso,4 vCPU, 8G RAM, 60 vDisk。最小化安装。需联网。 系统环境 关闭防火墙 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld selinux关闭 sed -ri…...
泛目录和泛站有什么差别
啥是 SEO 泛目录? 咱先来说说 SEO 泛目录是啥。想象一下,你有一个巨大的图书馆,里面的书架上摆满了各种各样的书,每一本书都代表着一个网页。而 SEO 泛目录呢,就像是一个超级图书管理员,它的任务就是把这些…...
css 布局及动画应用(flex+transform+transition+animation)
文章目录 css 布局及动画应用animationtransform,transition,animation 综合应用实例代码实例解释 css 布局及动画应用 Display用法 作用:用于控制元素的显示类型,如块级元素、内联元素、无显示等。常见属性值及示例:…...
springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)
线上预览: 移动端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小红书凭借优秀的产品体验 和超高人气 目前成为笔记类产品佼佼者 此项目将详细介绍如何使用Vue.js和Spring Boot 集合uniapp 开发一个仿小红书应用,凭借uniapp 可以在h5 小程序 app…...
lombok在高版本idea中注解不生效的解决
环境: IntelliJ IDEA 2024.3.1.1 Spring Boot Maven 问题描述 使用AllArgsConstructor注解一个用户类,然后调用全参构造方法创建对象,出现错误: java: 无法将类 com.itheima.pojo.User中的构造器 User应用到给定类型; 需要:…...
跨境电商领域云手机之选:亚矩阵云手机的卓越优势
在跨境电商蓬勃发展的当下,云手机已成为众多企业拓展海外市场的得力助手。亚矩阵云手机凭借其独特优势,在竞争激烈的云手机市场中崭露头角。不过,鉴于市场上云手机服务供应商繁多,企业在抉择时需对诸多要素予以审慎考量。 跨境电商…...
Linux第二课:LinuxC高级 学习记录day02
2.4、shell中的特殊字符 2.4.4、命令置换符 或者 $() 反引号:esc下面的按键,英文状态下直接按 功能:将一个命令的输出作为另一个命令的参数 echo 不会认为hostname是一个命令 加上 之后,先执行hostname,拿到主机名…...
6. NLP自然语言处理(Natural Language Processing)
自然语言是指人类日常使用的语言,如中文、英语、法语等。 自然语言处理是人工智能(AI)领域中的一个重要分支,它结合了计算机科学、语言学和统计学的方法,通过算法对文本和语音进行分析,使计算机能够理解、解…...
win10电脑 定时关机
win10电脑 定时关机 https://weibo.com/ttarticle/p/show?id2309405110707766296723 二、使用任务计划程序设置定时关机打开任务计划程序: 按下“Win S”组合键,打开搜索框。 在搜索框中输入“任务计划程序”,然后点击搜索结果中的“任务…...
linux删除用户
1、查看账号 cat /etc/passwd 查看所有用户账号信息:该文件记录了系统中的所有用户账号信息,包括用户名、用户ID、用户所属组等。 2、删除账号 基本删除:使用userdel命令删除用户账号,格式为userdel [选项] 用户名。如果不加任…...
FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )
以Xilinx 公司Virtex-II 系列FPGA 为例,其基本结构由下图所示。它是主要由两大部分组成:可编程输入/输出(Programmable I/Os)部分和内部可配置(Configurable Logic)部分。 可编程输入/输出(I/Os…...
Springboot项目如何消费Kafka数据
目录 一、引入依赖二、添加Kafka配置三、创建 Kafka 消费者(一)Kafka生产的消息是JSON 字符串1、方式一2、方式二:需要直接访问消息元数据 (二)Kafka生产的消息是对象Order 四、创建 启动类五、配置 Kafka 生产者&…...
LeetCode 热题 100 | 子串
子串基础 前缀和:前面的数加在一起等于多少,放进map里,key为和,value为这个和出现的次数。单调队列:单调递增/递减队列,每次加入新元素,比新元素大/小的元素全部弹出。滑动窗口:两层…...
深度学习笔记11-优化器对比实验(Tensorflow)
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 目录 一、导入数据并检查 二、配置数据集 三、数据可视化 四、构建模型 五、训练模型 六、模型对比评估 七、总结 一、导入数据并检查 import pathlib,…...
【掌握 JavaScript 数组迭代:map 和 includes 的使用技巧】
map map()方法是数组原型的一个函数,用于对数组的每个元素执行一个函数,并返回一个新的数组,其中包含么哦一个元素执行的结果。 语法 const newArray array.map(callback(currentValue, index, arr), thisValue)参数 callback࿱…...
深入浅出 Android AES 加密解密:从理论到实战
深入浅出 Android AES 加密解密:从理论到实战 在现代移动应用中,数据安全是不可忽视的一环。无论是用户隐私保护,还是敏感信息的存储与传输,加密技术都扮演着重要角色。本文将以 AES(Advanced Encryption Standard&am…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
java+webstock
maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...
标注工具核心架构分析——主窗口的图像显示
🏗️ 标注工具核心架构分析 📋 系统概述 主要有两个核心类,采用经典的 Scene-View 架构模式: 🎯 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 🔧 关键函数&…...
使用ch340继电器完成随机断电测试
前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...
