LeetCode hot 100—腐烂的橘子

力扣刷题-腐烂的橘子-解题思路与思考 我一开始是想用DFS做,但是用DFS涉及到一个问题:它是从一个结点开始,递归寻找属于图的节点,直到这个结点递归结束。因此,用多源BFS做。我们最开始应该在队列q中加入所有的已经腐烂的橘子,之后再把和他们直接邻接的放在第二行,以此类推…… 阅读详情

题目

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

分析

为了解决这个问题,可以使用广度优先搜索(BFS)算法。BFS 非常适合解决这类逐层扩散的问题,因为它能够按照层次顺序遍历图,恰好符合橘子腐烂的过程,即每分钟向周围扩散一层。

BFS

代码解释

初始化部分:遍历网格,将所有腐烂的橘子的坐标加入队列 rottenQueue,同时统计新鲜橘子的数量 freshCount。

BFS 过程:

  • 当队列不为空且还有新鲜橘子时,进行 BFS。
  • 每一轮 BFS 处理当前队列中的所有腐烂橘子,将其周围的新鲜橘子变为腐烂橘子,并将新腐烂的橘子加入队列。
  • 每一轮 BFS 结束,分钟数 minutes 加 1。

结果判断:如果最后没有新鲜橘子了,返回 minutes;否则返回 -1。

时间复杂度:O(m\times n)

空间复杂度:O(m\times n)

class Solution {
public:
    int orangesRotting(std::vector<std::vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size();
        std::queue<std::pair<int, int>> rottenQueue;
        int freshCount = 0;
        int minutes = 0;

        // 初始化队列,将所有腐烂的橘子加入队列,并统计新鲜橘子的数量
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 2) {
                    rottenQueue.push({i, j});
                } else if (grid[i][j] == 1) {
                    ++freshCount;
                }
            }
        }
        // 定义四个方向:上、下、左、右
        std::vector<std::pair<int, int>> directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        // BFS 过程
        while (!rottenQueue.empty() && freshCount > 0) {
            int currentSize = rottenQueue.size();
            for (int i = 0; i < currentSize; ++i) {
                auto [x, y] = rottenQueue.front();
                rottenQueue.pop();
                // 遍历四个方向
                for (const auto& [dx, dy] : directions) {
                    int newX = x + dx;
                    int newY = y + dy;
                    // 检查新位置是否合法且为新鲜橘子
                    if (newX >= 0 && newX < m && newY >= 0 && newY < n && grid[newX][newY] == 1) {
                        grid[newX][newY] = 2;
                        --freshCount;
                        rottenQueue.push({newX, newY});
                    }
                }
            }
            // 每一轮 BFS 结束,分钟数加 1
            ++minutes;
        }
        // 如果还有新鲜橘子,说明无法全部腐烂,返回 -1
        return freshCount == 0 ? minutes : -1;
    }
};    
LeetCode-994-腐烂的橘子 题意描述: 在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。 返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。 提示: 1 <= grid.length <= 10 1 <= grid[0].length <= 10 grid[i][j] 仅为 0、1 或 2 示例: 一: 输入:[[2,1,1],[1,1,0],[0,1,1]] 输出:4 二: 输入:[[2,1,1],[0,1,1],[1,0,1]] 输出:- 立即下载

相关推荐

Docker拉取ubuntu22.04镜像使用ROS2 humble及仿真工具可视化进行导航

Docker中安装Ubun22以及ROS,gazebo可视化等

lovebc的博客 1678

腐烂的橘子 - (LeetCode)

994. 腐烂的橘子 - 力扣(LeetCode),今天刷到这道题,开始按照自己实现的思路写了一次,通过了调试,但是提交的时候,来了一个大的数据,就没有通过测试,百思不得其解,看了网上的思路,使用了java的Queue队列对象来进行解题,平时都没什么机会使用Queue队列,这次认真学习了Queue队列对象,代码优化后节省了一般的代码很多,而且优化了解题的思路。先学习下Queue队列对象。

闲聊闲逛技术圈 1159

Hermes+MemOS记忆系统:用SQLite构建可编辑AI个人认知资产

AI记忆不是简单延长上下文或叠加RAG,而是构建具备分层存储、混合检索与自然语言反馈能力的个人认知资产。其核心原理在于将用户交互痕迹(L1)、偏好策略(L2)、结构化世界模型(L3)和结晶化技能统一管理,实现记忆的可追溯、可修正、可进化。技术价值体现在降低token消耗、提升长程一致性、支持离线演进,并突破传统‘静态快照’式知识库局限。典型应用场景包括个人知识助手、客服工单分析Agent、研发文档理解系统等。本文聚焦Hermes Agent与MemOS深度集成方案,详解SQLite作为ACID底座支撑L1/

weixin_33623304的博客 434

LeetCode994. 腐烂的橘子( BFS )

力扣 解题思路: 广度优先搜索 1.先找到所有的腐烂橘子,入队 (queue),用第一批带出新一批腐烂的橘子 2.每一批橘子都会在一分钟之内腐烂,所以此题可以转化为求BFS执行的大循环的次数 3.这里的step (次数)的更新需要有一个标记,只有新的腐烂的橘子加入(queue不为空),step才能自加 4.最后BFS执行完之后,说明所有可以被腐烂的都完成了,再去遍历grid,如何还有 值为1的,说明没有办法完...

向未来❀去探索 的博客 2486

深入解析STM32F103R6的USB OTG_FS双重角色设备(DRD)设计与应用

本文深入解析了STM32F103R6的USB OTG_FS双重角色设备(DRD)设计与应用。详细阐述了其作为USB主机和设备双重角色的硬件设计要点,包括VBUS电源管理与ID引脚配置,并提供了设备模式(如虚拟串口CDC)与主机模式(如读取U盘文件)的软件实现实战指南,帮助开发者充分发挥该芯片的OTG潜力。

weixin_29195615的博客 268

UG NX二次开发(Python)-API函数介绍与应用实例(三)-UFLayer类操作

采用Python语言进行UG NX二次开发的帮助材料很少,采用录制的方法是一种比较容易实现的方式,但是使用UFun函数更容易上手,我们以后将逐渐的将Python-UFun的功能写进博客中,以便于有需要的人采纳和研究。本博客是为了入门需要,采用简单的创建长方体的功能来讲一下怎么使用Python语言开发。我们今天以移动长方体到某一个图层为例,讲一下UFLayer类中部分函数的使用。另外,我们长期提供UG NX二次开发的功能开发和咨询服务,有疑问可以私信博主或者在评论区讨论。

GimiGimmy 708

LeetCode刷题-994. 腐烂的橘子

难度:中等⭐️⭐️⭐️⭐️。

快乐的小小程序猿 568

(27)FPGA实现AD7768接口(六)

AD7768/AD7768-4 为8通道和4通道24位同步采样模数转换器(ADC)。通过可选的功耗模式和数字滤波器选项可重新配置AD7768/AD7768-4以适应多种应用,如工业输入/输出模块、仪器仪表、音频测试、控制回路和状态监控。FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。

m0_46498597的博客 997

【LeetCode】hot100— 994. 腐烂的橘子_BFS

直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。输入:grid = [[2,1,1],[1,1,0],[0,1,1]]的新鲜橘子都会腐烂。通过 BFS 来实现。

weixin_44382896的博客 1267

高频网络协议与编程IO相关面试基本问题和知识点整理

网络IO相关基本高频面试基本问题和知识点整合

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 173万+

ThingsBoard教程(十九):规则节点概览介绍

在ThingsBoard的CE V2.5.6版本中,一共有这几种类型在每一种类都有包含了多个节点,每一种类型的节点都有不同的颜色表示本篇文章做一个简单的概括,后续的文章会详细讲解每一个种类的节点如何使用,每一个节点的使用。一共有10个,使用黄色表示 过滤器节点用于消息过滤和路由。一共有9个,使用绿色 属性节点用于更新传入消息的元数据。一共三个,使用蓝色 转换节点用于更改传入消息字段,如发起者、消息类型、有效负载和元数据。一共21个,使用红色标识 动作节点根据传入的消息执行各种动作。一共9个,使用黄色表示,

知无涯 1万+

【力扣hot100题】(051)腐烂的橘子

方法是先将橘子全部遍历一遍,做两件事:①找出所有连通的橘子②找出所有腐烂的橘子,设置一个vector<queue<int>>,每个vector元素代表一片连通的橘子,其中的queue代表这片连通橘子中腐烂的橘子,这样当即就可以判断有没有橘子永远不会腐烂。然后再遍历我们设置的vector<queue<int>>,每次取出队列头元素,遍历四个方向,将四个方向可以被腐烂的橘子全部加入队列,如果没有可以遍历的橘子了就比较最终时间和结果result,然后遍历下一片连通橘子。这道题写了特别久,不过好歹也是写出来了……

s478527548的博客 479

基于libVLC的视频播放器之四:直接使用libVLC

一.效果 播放本地文件 播放网络url:rtsp://3.84.6.190/vod/mp4:BigBuckBunny_115k.mov 二.实现 既然有VLC-Qt,为什么还要直接调用libVLC呢,因为直接调用会加深对整个播放流程的理解,方便后面修改VLC-Qt源码。 注意事项: 1.编译报错:error C2065: “libvlc_media_read_cb”: 未声明的标识符。修改如下: 2.libvlc_new(0, nullptr)返回null 将plugins

草上爬的博客 5049

leetcode hot100 腐烂的橘子

bfs主要用于解决最短路径的问题,这个最短时间也是一样的。直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。# 腐烂时间,实际上就是广度优先搜索的深度。# 找到 所有 的腐烂句子当做其实节点。这里使用bfs来做,把每一层抽象成腐烂句子就行了。的新鲜橘子都会腐烂。

chenziang1的博客 721

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

leetcode hot100-52 腐烂的橘子

【代码】leetcode hot100-52 腐烂的橘子。

m0_58625012的博客 142

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【leetcode hot 100 994】腐烂的橘子

ArrayDeque:插入时可能存在扩容过程,但均摊后的插入操作依然为 O(1)。LinkedList:每次插入数据时均需要申请新的堆空间,均摊性能相比更慢。LinkedList:早在 JDK 1.2 中就已经存在。ArrayDeque:基于可变长的数组和双指针来实现。ArrayDeque:在 JDK 1.6 中被引入。ArrayDeque:不支持存储 null 数据。LinkedList:支持存储 null 数据。LinkedList:基于双向链表来实现。

longii11的博客 841

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Leetcode hot 100】994.腐烂的橘子

摘要 LeetCode 994题要求计算腐烂橘子扩散到所有新鲜橘子的最短时间。通过BFS算法实现:首先统计初始腐烂橘子和新鲜橘子数量,将腐烂橘子坐标存入队列作为扩散起点。在BFS过程中,每分钟处理当前层的所有腐烂橘子,向四个方向扩散,标记相邻新鲜橘子为腐烂并更新队列。最终若新鲜橘子数量为0,返回扩散时间;否则返回-1。时间复杂度O(mn),空间复杂度O(mn)。示例验证表明算法正确性。

专注Java和MySQL领域知识分享 640

LeetCode Hot 100 腐烂的橘子

在给定的 网格 中,每个单元格可以有以下三个值之一:每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 。示例 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: 输入:

2302_76776557的博客 361

力扣hot100 | 图论 | 200. 岛屿数量、994. 腐烂的橘子、207. 课程表、208. 实现 Trie (前缀树)

给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [输出:1示例 2:输入:grid = [输出:3。

m0_56231308的博客 993

【Hot100】LeetCode—994. 腐烂的橘子

【代码】【Hot100】LeetCode—994. 腐烂的橘子。

weixin_44382896的博客 1159

力扣Hot100-994腐烂的橘子

由于在找到腐烂水果后直接将它周围的水果置为腐烂水果,但是可能当前轮次腐烂的水果,又在当前轮次中影响周围水果,导致错误,所以可以标记:在不同轮次中被传染腐烂的水果标记为不同的数字,由于一开始time=0时,腐烂水果标记为2,所以在time=0到1这段时间被传染的水果标记为2+time+1,这样就可以使得本轮time=0时不会让标记为3的水果传染它周围的水果。左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0。

qq_52241267的博客 549

Leetcode Hot 100 994.腐烂的橘子(橘子为什么会烂!!!

q.empty() && fresh > 0) { //当队列里有腐烂橘子且有新鲜桔子时才进入循环。// 将新腐烂的橘子加入队列。//x,y是队列第一个元素。// 存储腐烂橘子的位置。// 新鲜橘子数量减少。// 初始化:统计新鲜橘子的数量,并将腐烂橘子的位置加入队列。// 感染所需的时间。// 检查边界和是否为新鲜橘子。// 新鲜橘子的数量。// 如果仍有新鲜橘子,返回 -1;// 如果没有新鲜橘子,直接返回 0。// 四个方向:上、下、左、右。

Kimsanmyeong的博客 911

力扣HOT100之图论:994. 腐烂的橘子

我们需要统计出腐烂至全地图时所需的最少扩散次数,当然也存在有的橘子无法被腐烂的情况,因此我们需要先统计初始状态下的新鲜橘子个数,每当扩散一次,被扩散的新鲜橘子就变成腐烂橘子,并将新鲜的橘子数减去对应的数量,当扩散结束后,如果新鲜的橘子数量大于0,则说明无法腐烂所有的橘子,我们直接返回。循环每循环一次,就是从当前的其中一个腐烂橘子向四周扩散了一次,被腐烂的橘子将加入队列,但是不会参与内层循环的过程,因为在内层循环腐烂的橘子并不是本轮的初始腐烂橘子,应当在下一次外层。循环每循环一次,就代表扩散了一次,内层。

weixin_52151595的博客 591

Leetcode hot100-994 腐烂的橘子

【代码】Leetcode hot100-994 腐烂的橘子。

qq_57277346的博客 39

LeetCode Hot100 腐烂的橘子

直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。的新鲜橘子都会腐烂。

Deep_C的博客 222

LeetCode Hot100 994.腐烂的橘子

bfs 最短路径问题

qq_57349657的博客 503
上一篇: LeetCode hot 100—搜索二维矩阵
下一篇: LeetCode hot 100—括号生成
rigidwill666
博客等级 码龄7年 508粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rigidwill666

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值