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

news2024/9/26 5:21:25

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

题目

在给定的 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.coloradmin.cn/o/1909755.html

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

相关文章

【源码+文档+调试讲解】文物管理系统

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

浅谈重要组件Beanshell

浅谈重要组件Beanshell BeanShell是JMeter中一个非常实用的组件&#xff0c;它允许用户通过Java-like的脚本语言执行自定义逻辑&#xff0c;从而极大地扩展了JMeter的功能。本文将详细介绍BeanShell的使用方法、常见用途、以及其在JMeter中的具体应用场景。 BeanShell概述 Bea…

使用vllm部署大语言模型

vLLM是一个快速且易于使用的库&#xff0c;用于LLM&#xff08;大型语言模型&#xff09;推理和服务。通过PagedAttention技术&#xff0c;vLLM可以有效地管理注意力键和值内存&#xff0c;降低内存占用和提高计算效率。vLLM能够将多个传入的请求进行连续批处理&#xff0c;从而…

Java语言程序设计——篇二(2)

Java语言基础 运算符与表达式运算符1、算术运算符2、关系运算符3、逻辑运算符&#xff08; &&、||、 !、&、| 、^&#xff09;4、位运算符&#xff08; >>、<<、>>>、&、|、^、~&#xff09;5、赋值运算符6、条件运算符7、字符串运算符8、…

基于Tkinter GUI库的ARP欺骗攻击工具

基于Tkinter GUI库的ARP欺骗攻击工具 程序提供了一个简单易用的GUI界面,让用户可以方便地进行ARP欺骗攻击。但ARP欺骗是一种黑客攻击手段,可能会造成严重的网络安全问题,请谨慎使用,仅限于合法的网络安全测试和研究目的。 这个ARP欺骗工具需要用户输入目标主机的IP和MAC地址,…

去中心化时代的到来:区块链如何重新定义权力和控制

随着区块链技术的迅猛发展&#xff0c;我们正逐步进入一个去中心化的新时代。区块链不仅仅是一种技术&#xff0c;更是一种理念&#xff0c;它通过去除中心化的权威和控制节点&#xff0c;重新定义了数据管理、交易验证和权力分配的方式。本文将深入探讨区块链如何在去中心化时…

【软件测试】 1+X初级 功能测试试题

登录模块需求说明书 人力资源管理系统 Web 端分为系统管理员、人资管理员、普通职员三个角色。系统登录模块 需求包括用户&#xff08;UI&#xff09;页面、业务规则两部分。 UI 页面 登录页 业务规则 【登录】 人资管理员、普通职员需要通过登录页面进入系统&#xff08;We…

Python项目结构和组织

1、问题背景 在Python中&#xff0c;如何将项目中的代码逻辑地组织到不同的文件/类中&#xff1f;这种情况在C#/Java等语言中很常见&#xff0c;想要了解Python项目中如何实现类似的结构。另外&#xff0c;在Python中是否存在“命名空间”&#xff0c;“项目”和“面向对象原则…

Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比

章节内容 上一节完成了如下的内容&#xff1a; 编写Agent Conf配置文件收集Hive数据汇聚到HDFS中测试效果 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0…

springboot+vue+mybatis图书销售管理系统+PPT+论文+讲解+售后

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括图书销售管理系统的网络应用&#xff0c;在外国图书销售管理系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。图书销售管理系统具有网上图书信息管…

基础跟张宇,强化用36讲还是高数辅导讲义?

基础跟的张宇老师&#xff0c;强化阶段跟谁要看基础学的怎么样&#xff01; 因为张宇老师今年课程大改版&#xff0c;和以往的课程一点也不一样&#xff01; 具体变动是&#xff1a; 张宇老师把往年强化阶段的知识前移&#xff0c;也就是说现在的基础阶段要讲的内容是以往基…

隧道定位导航的解决方案

隧道定位导航是一个复杂但重要的技术领域&#xff0c;主要面临的是隧道内卫星信号受遮挡导致定位困难的问题。以下是对隧道定位导航技术的详细分析&#xff1a; 一、隧道定位导航的挑战 在隧道等封闭环境中&#xff0c;由于山体或建筑物的遮挡&#xff0c;卫星信号往往无法直接…

无线领夹麦克风哪个牌子好,揭秘口碑最好降噪领夹麦排行榜

在这个短视频如日中天的时代&#xff0c;无数自媒体创作者纷纷借助这一媒介&#xff0c;通过直播带货、分享生活点滴、在线卡拉OK等形式&#xff0c;捕捉并分享生活中的美好时刻。一个成功的短视频&#xff0c;不仅需要创意构思和稳定的画面质量&#xff0c;更离不开清晰纯净的…

【CSS in Depth 2 精译】2.6 CSS 自定义属性(即 CSS 变量)+ 2.7 本章小结

文章目录 2.6 自定义属性&#xff08;即 CSS 变量&#xff09;2.6.1 动态变更自定义属性 2.7 本章小结 当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性 …

【日常记录】【插件】js 获取浏览器信息、操作系统等相关信息

文章目录 1. 原生方式2. 插件的方式2.1 Bowser 的基本使用2.2 UAParser2.3 Platform.js 参考链接 1. 原生方式 原生方式可以通过 navigator.userAgent 来获取 需要写一个正则来匹配&#xff0c;获取相关的信息 2. 插件的方式 获取浏览器版本相关信息的库主要有以下几个 Bowser&…

从零开始做题:easycap

题目 给出一个pcap文件 解题 注&#xff1a;传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议 .pcap文件需要用Wireshark打开 用Wireshark打开easycap.pcap文…

leetcode--层数最深叶子节点的和

leetcode地址&#xff1a;层数最深叶子节点的和 给你一棵二叉树的根节点 root &#xff0c;请你返回 层数最深的叶子节点的和 。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,null,6,7,null,null,null,null,8] 输出&#xff1a;15 示例 2&#xff1a; 输入&#xff…

16张支付牌照将到期,新规落地以来,支付牌照的首次续展。

7月9日&#xff0c;包括瑞银信、乐刷、畅捷支付在内的16家第三方支付机构的支付牌照将到期&#xff0c;这些公司面临续展的重大考验。 这是《非银行支付机构监督管理条例》实施以来&#xff0c;支付牌照的首次续期。 其中&#xff0c;最受瞩目的可能是瑞银信。在范一飞落马后&a…

AI绘画:艺术与科技的交融,创新浪潮与无限可能

在科技日新月异的当下&#xff0c;AI 绘画作为人工智能领域的一颗璀璨新星&#xff0c;正以惊人的速度在国内崭露头角&#xff0c;引发了艺术与技术交融的全新变革。随着人工智能技术的飞速发展&#xff0c;AI绘画已成为艺术与科技交融的新宠。2024年&#xff0c;AI绘画行业在国…

最新版萌新Python看过最好的电子书?

我之前写过一篇 Python 入门看哪些书的文章&#xff0c;文章中罗列了 5 位大佬的书单推荐&#xff0c;在这个基础上我总结了自己看过的书单。你要是不知道学 Python 看什么书好&#xff0c;不妨参考一下&#xff1a; 一晃就到了月末&#xff0c;2020年也过去了 2 个月&#xf…