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…...
NEURAL MASK 时尚设计应用:AI辅助生成服装图案与面料效果
NEURAL MASK 时尚设计应用:AI辅助生成服装图案与面料效果 最近和几位做服装设计的朋友聊天,他们都在感慨,找灵感、画草图、做面料效果图,一套流程下来,时间成本太高了。有时候一个系列要出几十个图案,光是…...
页面置换算法-存储器管理
页面置换算法详解(存储器管理) 在操作系统存储器管理中,页面置换算法是虚拟存储系统的核心机制。当内存已满,需要调入新页面时,系统必须选择内存中的哪个页面被换出。页面置换算法的优劣直接影响到系统的缺页率和有效访问时间。系统分析师需要掌握经典置换算法的原理、优…...
AI修图新体验:LongCat-Image-Edit快速部署,轻松实现图片局部修改
AI修图新体验:LongCat-Image-Edit快速部署,轻松实现图片局部修改 1. 模型简介:一句话精准修图 LongCat-Image-Edit是美团团队开源的一款革命性图像编辑工具,它能通过简单的文字指令实现图片的精准修改。与传统的图像生成工具不同…...
告别网页版!用Ollama在本地部署Llama-3.2-3B的实战
告别网页版!用Ollama在本地部署Llama-3.2-3B的实战 1. 为什么选择本地部署Llama-3.2-3B 1.1 网页版大模型的局限性 使用网页版大模型服务时,我们常常面临几个痛点:响应速度受限于网络质量、对话历史无法长期保存、隐私数据可能被上传到云端…...
gte-base-zh中文文本表征能力解析:在成语理解、古诗嵌入、方言识别中的表现
gte-base-zh中文文本表征能力解析:在成语理解、古诗嵌入、方言识别中的表现 1. 模型简介与部署指南 gte-base-zh是由阿里巴巴达摩院训练的中文文本嵌入模型,基于BERT架构专门针对中文语境优化。这个模型在大规模相关文本对语料库上进行训练,…...
Z-Image-Turbo_Sugar脸部Lora效果对比:Euler a vs DPM++ 2M SDE生成质量评测
Z-Image-Turbo_Sugar脸部Lora效果对比:Euler a vs DPM 2M SDE生成质量评测 1. 模型介绍与部署准备 Z-Image-Turbo_Sugar脸部Lora是一个专门针对甜美风格人像生成的AI模型,基于Z-Image-Turbo的Lora版本进行优化。这个模型特别擅长生成具有"纯欲甜妹…...
StructBERT中文语义相似度工具5分钟快速部署:零基础搞定本地GPU加速
StructBERT中文语义相似度工具5分钟快速部署:零基础搞定本地GPU加速 1. 工具简介与核心价值 StructBERT中文语义相似度工具是一款基于StructBERT-Large模型开发的本地化解决方案,专门用于中文句子对的语义匹配度分析。这个工具解决了传统方案中的几个关…...
杰理之中控耳机支持通话中进行BLE广播的修改【篇】
修改ESCO和BLE广播的调度策略...
基于SpringBoot + Vue的眼科患者随访管理系统(角色:患者、医生、管理员)
文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 💛博主介绍&#…...
28、什么是防抖和节流?有什么区别?如何实现?
这是前端面试里的高频题,几乎每个做过交互、性能优化的人都会被问到。 如果你只是回答“防抖就是延迟执行,节流就是固定时间执行一次”,只能算及格。 如果你能讲清楚: 概念区别适用场景实现方式进阶参数面试表达方式 那这题会答…...
