LeetCode 算法:腐烂的橘子 c++

原题链接🔗:腐烂的橘子
难度:中等⭐️⭐️

题目

在给定的 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. 解题思路

LeetCode 上的 “腐烂的橘子” 问题是一个模拟问题,属于中等难度。这个问题的目的是模拟一个过程,其中一些橘子可能开始腐烂,并且腐烂的橘子可以影响周围的橘子,使它们也腐烂。

问题描述: 在一个给定的二维数组中,每个单元格可以包含一个未腐烂的橘子(用 1 表示)或者一个腐烂的橘子(用 2 表示)。每分钟,任何与腐烂的橘子相邻的未腐烂的橘子都会腐烂。注意,腐烂的橘子不会继续腐烂。你需要找出使所有橘子腐烂所需的最少分钟数。

解题思路:

  • 分析问题:首先,我们需要理解问题的要求和橘子腐烂的规则。
  • 初始化:记录所有腐烂橘子的位置和数量。
  • 模拟过程:
    • 从腐烂的橘子开始,每分钟检查它们周围的橘子,如果它们是未腐烂的,就将它们标记为腐烂。
    • 同时记录下所有未腐烂的橘子,因为它们可能在下一轮被腐烂的橘子影响。
  • 更新状态:每分钟结束后,更新所有腐烂橘子的状态,并将之前未腐烂的橘子标记为腐烂。
  • 循环结束条件:如果所有的橘子都腐烂了,结束循环。
  • 返回结果:返回循环的轮数,即所需的最少分钟数。

算法步骤:

  • 记录初始状态:找到所有腐烂橘子的位置,并记录未腐烂橘子的数量。
  • 模拟腐烂过程:
    • 对于每个腐烂的橘子,检查其上下左右四个方向的橘子。
    • 如果发现未腐烂的橘子,将其标记为腐烂,并更新未腐烂橘子的计数。
  • 更新时间:每分钟结束时,所有标记为腐烂的橘子都变为腐烂状态。
  • 检查结束条件:如果未腐烂的橘子计数为0,即所有橘子都已腐烂,返回当前分钟数。
  • 重复步骤2-4,直到所有橘子都腐烂。
  1. c++ demo
#include <iostream>
#include <vector>
#include <queue>using namespace std;class Solution {
public:int orangesRotting(vector<vector<int>>& grid) {int row = grid.size();if (row == 0) return 0;int col = grid[0].size();queue<pair<int, int>> rotten;vector<vector<int>> fresh(row, vector<int>(col, 0));int totalFresh = 0, minutes = 0;// 计算初始腐烂和新鲜橘子的数量for (int i = 0; i < row; ++i) {for (int j = 0; j < col; ++j) {if (grid[i][j] == 2) {rotten.push({ i, j });}else if (grid[i][j] == 1) {totalFresh++;fresh[i][j] = 1;}}}// 四个方向的移动vector<pair<int, int>> directions = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };while (!rotten.empty() && totalFresh > 0) {int size = rotten.size();for (int k = 0; k < size; ++k) {auto [x, y] = rotten.front();rotten.pop();for (auto& dir : directions) {int newX = x + dir.first, newY = y + dir.second;if (newX >= 0 && newX < row && newY >= 0 && newY < col && fresh[newX][newY] == 1) {fresh[newX][newY] = 0;totalFresh--;rotten.push({ newX, newY });}}}minutes++;}return totalFresh == 0 ? minutes : -1;}
};int main() {Solution solution;vector<vector<int>> grid = {{2, 1, 1},{1, 1, 0},{0, 1, 1}};cout << "Minimum minutes required for all oranges to rot: " << solution.orangesRotting(grid) << endl;return 0;
}
  • 输出结果:

Minimum time to rot all oranges: 4

  1. 代码仓库地址:orangesRotting

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

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

相关文章

选择适合的220V转5V电源芯片,220V转5V非隔离降压电源ic

#### 问题&#xff1a; 在设计一个需要将220V交流电转换为5V直流电的电路时&#xff0c;我应该选择哪种型号的电源芯片&#xff1f;我需要输出电流在200mA以内&#xff0c;有没有推荐的型号&#xff1f; #### 答案&#xff1a; 在220V交流电转换为5V直流电的应用中&#xff0c…

解析 pdfminer layout.py LAParams类及其应用实例

解析 pdfminer layout.py LAParams类及其应用实例 引言类的定义1. line_overlap2. char_margin3. word_margin4. line_margin5. boxes_flow6. detect_vertical7. all_texts 类的初始化参数验证类的表示总结 引言 在这篇文章中&#xff0c;我们将解析一个叫做 LAParams 的类。这…

Lumen 9/10 版本中使用 Laravel Lang

安装 composer require --dev laravel-lang/common:^4.1注册/加载 方式一&#xff08;推荐&#xff09; bootstrap/app.php 中取消注释 $app->register(App\Providers\AppServiceProvider::class); app/Providers/AppServiceProvider.php 的 register 方法中添加&#x…

[C++][ProtoBuf][Proto3语法][一]详细讲解

目录 1.字段规则2.消息类型的定义与使用1.定义2.使用 3.enum类型1.语法2.定义时注意3.代码 1.字段规则 消息的字段可以⽤下⾯⼏种规则来修饰&#xff1a; singular&#xff1a;消息中可以包含该字段零次或⼀次(不超过⼀次) proto3语法中&#xff0c;字段默认使⽤该规则 repeat…

从入门到精通:网络基础详解

前言 在现代社会&#xff0c;网络技术已经成为我们日常生活和工作中不可或缺的一部分。从简单的网页浏览到复杂的分布式系统&#xff0c;网络技术都扮演着至关重要的角色。通过这篇文章&#xff0c;读者将从入门到精通&#xff0c;全面掌握网络编程的理论和实践。 重点摘要 …

【Spring Boot】Spring AOP中的环绕通知

目录 一、什么是AOP?二、AOP 的环绕通知2.1 切点以及切点表达式2.2 连接点2.3 通知&#xff08;Advice&#xff09;2.4 切面(Aspect)2.5 不同通知类型的区别2.5.1 正常情况下2.5.2异常情况下 2.6 统一管理切点PointCut 一、什么是AOP? Aspect Oriented Programming&#xff…

if语句如果侧边栏没有值就填满,否则为width: 180px

要实现这个逻辑&#xff0c;我们可以使用JavaScript&#xff08;配合CSS&#xff09;来根据侧边栏&#xff08;我们假设是一个具有特定ID或类的DOM元素&#xff09;的内容或值来决定其宽度。 HTML 假设你的侧边栏有一个ID为sidebar&#xff1a; <div id"sidebar&quo…

STM32学习历程(day5)

EXTI外部中断 中断 中断就是在主程序运行过程中 出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;CPU会暂停当前的程序&#xff0c;去处理中断程序 处理完会返回被暂停的位置 继续运行原来的程序。 中断优先级 当有多个中断源同时申请中断时 CPU会根据…

【面试八股总结】线程基本概念,线程、进程和协程区别,线程实现

一、什么是线程&#xff1f; 线程是“轻量级进程”&#xff0c;是进程中的⼀个实体&#xff0c;是程序执⾏的最小单元&#xff0c;也是被系统独立调度和分配的基本单位。 线程是进程当中的⼀条执行流程&#xff0c;同⼀个进程内多个线程之间可以共享代码段、数据段、打开的文件…

王老师 linux c++ 通信架构 笔记(二)配置服务器为固定的 ip 地址、远程登录、安装 gcc g++ 与虚拟机文件夹共享

&#xff08;7&#xff09;本条目开始配置 linux 的固定 ip 地址&#xff0c;以作为服务器使用&#xff1a; 首先解释 linux 的网口编号&#xff1a; linux 命令 cd &#xff1a; change directory 改变目录。 ls &#xff1a; list 列出某目录下的文件 根目录文件名 / etc &a…

JAVA基础-----final关键字

一、前言 final关键字的含义&#xff1a; final在Java中是一个保留的关键字&#xff0c;可以声明成员变量、方法、类以及本地变量。一旦你用final修饰&#xff0c;你将不能改变被修饰的代码&#xff0c;编译器会检查代码&#xff0c;如果你试图将变量再次初始化的话&#xff0…

I 2U-Net:具有丰富信息交互的双路径 U-Net 用于医学图像分割| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 I 2U-Net: A dual-path U-Net with rich information interaction for medical image segmentation I 2U-Net&#xff1a;具有丰富信息交互的双路径 U-Net 用于医学图像分割 01 文献速递介绍 在计算机视觉领域&#xff0c;医学图像分割是一个主要挑战&#xff…

用python画一个爱心

1 问题 Python是一种常见的计算机编程语言&#xff0c;如何用python简单的画一个爱心呢&#xff1f; 2 方法 利用turtle库以及简单规范代码将爱心画出。 代码清单 1 from turtle import *pensize(1)pencolor(red)fillcolor(pink)speed(5)up()goto(-30,100)down()begin_fill()l…

【IMU】 椭球拟合标定加计Bias、Scale

椭球拟合简介 MESE IM&#xff35;中&#xff0c;x,y,z轴的度量单位并不相同&#xff0c;假设各轴之间相互直。 加计静止状态&#xff08;也就是只受重力的状态下&#xff09;&#xff0c;各个姿态只受重力的&#xff0c;x,y,z轴值&#xff08;假设x,y,z轴相互垂直并且度量单…

TCP的p2p网络模式

TCP的p2p网络模式 1、tcp连接的状态有以下11种 CLOSED&#xff1a;关闭状态LISTEN&#xff1a;服务端状态&#xff0c;等待客户端发起连接请求SYN_SENT&#xff1a;客户端已发送同步连接请求&#xff0c;等待服务端相应SYN_RECEIVED&#xff1a;服务器收到客户端的SYN请请求&…

Qt QChart 图表库详解及使用

文章目录 Qt QChart 图表库详解及使用一、Qt Charts 概述二、安装 Qt Charts1. 在项目中添加 Qt Charts三、Qt Charts 的基本使用1. 创建一个简单的折线图2. 添加图例和自定义样式四、Qt Charts 的交互功能1. 启用缩放和平移2. 启用数据点选择五、Qt Charts 的高级特性1. 多轴绘…

EPICS数据库示例

本文目标是使用EPICS数据库示例帮助新手理解如何使用不同的示例。 1、使用seq和mbbo的简单选择器 这个简单示例展示了如何使用一个mbbo和一个seq来旋转哪个值将被设置到一个PV。 # 这个mbbo记录将选择将运行seq的哪段 record(mbbo, "CHOOSE") {field(VAL, "…

ArcGIS中国工具(ArcGISCTools)等插件使用体验

ArcGIS中国工具&#xff08;ArcGISCTools&#xff09;的主要功能 1. 接合图表生成 这个功能允许用户生成标准分幅图的行政区边框注记&#xff0c;并在打印时自动加入。这对于需要制作标准地图的用户非常实用。 2. 图框工具 图框工具可以帮助用户创建和管理地图的图框&#…

Qt creator 控件转到槽 报错 The class containing “Ui:Dialog“ could not be found in

今天调试程序&#xff0c;发现主界面控件转到槽&#xff0c;报错如下图&#xff1a; 问题表现为&#xff1a;只有主窗口控件有这个错误&#xff0c;其他子窗口正常。 解决&#xff1a; 在网上搜这个报错信息&#xff0c;都没有一个很好的解决办法。 最后发现是我在子窗口中要…

Java根据经纬度获取两点之间的距离

Java根据经纬度获取两点之间的距离&#xff0c;最近在实现类似于钉钉打卡签到的需求&#xff0c;因为对精度要求不是很高&#xff0c;所以可以通过一个球面距离的公式来求两点距离&#xff0c;这里将地球当成一个球体&#xff0c;实际上地球是一个不规则的球体&#xff0c;所以…