【重点】【BFS】994.腐烂的橘子

BFS算法实战:腐烂橘子问题解析与实现 广度优先搜索(BFS)是图遍历中的基础算法,其核心原理是通过队列实现层序遍历,天然适合求解最短路径问题。在工程实践中,BFS常用于网格遍历、社交网络分析等场景,其时间复杂度为O(MN)具有较高效率。以LeetCode 994腐烂橘子问题为例,展示了如何用BFS模拟橘子腐烂过程:多源点同时扩散、方向向量优化等技巧。该问题与病毒传播模型高度相似,体现了算法在模拟自然现象中的价值。掌握BFS的队列实现和层序处理逻辑,能够解决各类扩散型问题,如社交网络的好友推荐、游戏路径规划等实际应用。 阅读详情

题目
非常类似的题目:542.01矩阵

法1:BFS

深刻理解!此方法类似二叉树层次搜索!!!

Python

class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])
        fresh = 0
        queue = collections.deque()
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1:
                    fresh += 1
                elif grid[i][j] == 2:
                    queue.append([i, j])
        res = 0
        dx = [1, -1, 0, 0]
        dy = [0, 0, 1, -1]
        while queue and fresh > 0:
            tmp_size = len(queue)
            res += 1
            for _ in range(tmp_size):
                [x, y] = queue.popleft()
                for i in range(4):
                    newX = x + dx[i]
                    newY = y + dy[i]
                    if (0 <= newX < m and 0 <= newY < n and grid[newX][newY] == 1):
                        grid[newX][newY] = 2
                        fresh -= 1
                        queue.append([newX, newY])
        
        return res if fresh == 0 else -1

Java

此方法类似二叉树层次搜索。

class Solution {
    public int orangesRotting(int[][] grid) {
        int[] dx = {-1, 1, 0, 0}; // 方向数组
        int[] dy = {0, 0, -1, 1};
        Queue<int[]> queue = new LinkedList<>();
        int m = grid.length, n = grid[0].length, res = 0, flash = 0;
        int[][] copyGrid = new int[m][n]; // 复制,保证不改变原始输入数组
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                copyGrid[i][j] = grid[i][j];
                if (grid[i][j] == 1) {
                    ++flash;
                } else if (grid[i][j] == 2) {
                    queue.offer(new int[]{i, j});
                }
            }
        }
        
        while (flash > 0 && !queue.isEmpty()) {
            ++res;
            int tmpSize = queue.size();
            for (int i = 0; i < tmpSize; ++i) {
                int[] loc = queue.poll();
                int x = loc[0], y = loc[1];
                for (int k = 0; k < 4; ++k) {
                    int newX = x + dx[k];
                    int newY = y + dy[k];
                    if ((newX >= 0 && newX < m) 
                            && (newY >= 0 && newY < n)
                            && copyGrid[newX][newY] == 1) {
                        copyGrid[newX][newY] = 2;
                        queue.offer(new int[]{newX, newY});
                        --flash;
                    }
                }
            }
        }

        if (flash > 0) {
            return -1;
        } 

        return res;
    }
}

版本2,code

class Solution {
    public int orangesRotting(int[][] grid) {
        int ans = 0, flash = 0, m = grid.length, n = grid[0].length;
        Queue<int[]> queue = new LinkedList<>();
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1) {
                    ++flash;
                } else if (grid[i][j] == 2) {
                    queue.offer(new int[]{i, j});
                }
            }
        }

        while (flash > 0 && !queue.isEmpty()) {
            ++ans;
            int size = queue.size();
            for (int i = 0; i < size; ++i) {
                int[] loc = queue.poll();
                int x = loc[0], y = loc[1];
                if (x - 1 >= 0) {
                    if (grid[x - 1][y] == 1) {
                        grid[x - 1][y] = 2;
                        --flash;
                        queue.offer(new int[]{x - 1, y});
                    }
                }
                if (x + 1 < m) {
                    if (grid[x + 1][y] == 1) {
                        grid[x + 1][y] = 2;
                        --flash;
                        queue.offer(new int[]{x + 1, y});
                    }
                }
                if (y - 1 >= 0) {
                    if (grid[x][y - 1] == 1) {
                        grid[x][y - 1] = 2;
                        --flash;
                        queue.offer(new int[]{x, y - 1});
                    }
                }
                if (y + 1 < n) {
                    if (grid[x][y + 1] == 1) {
                        grid[x][y + 1] = 2;
                        --flash;
                        queue.offer(new int[]{x, y + 1});
                    }
                }
            }
        }
        return flash > 0 ? -1 : ans;
    }
}

542. 01 矩阵

题目

class Solution:
    def updateMatrix(self, mat: List[List[int]]) -> List[List[int]]:
        m, n = len(mat), len(mat[0])
        res = [[0] * n for _ in range(m)]
        q = collections.deque()
        dis = 0

        for i in range(m):
            for j in range(n):
                if mat[i][j] == 0:
                    res[i][j] = 0
                    q.append([i, j])
        
        while q:
            tmpSize = len(q)
            dis += 1
            for i in range(tmpSize):
                [x, y] = q.popleft()
                dx = [1, -1, 0, 0]
                dy = [0, 0, 1, -1]
                for i in range(4):
                    newX = x + dx[i]
                    newY = y + dy[i]
                    if 0 <= newX < m and 0 <= newY < n and mat[newX][newY] == 1:
                        res[newX][newY] = dis
                        mat[newX][newY] = 0
                        q.append([newX, newY])
        
        return res
无需UMAT:基于Abaqus内置模型实现形状记忆聚合物结构的热-力耦合仿真 本文详细介绍了如何利用Abaqus内置模型实现形状记忆聚合物(SMP)的热-力耦合仿真,无需编写复杂的UMAT子程序。通过广义Maxwell模型和Neo-Hookean模型的组合应用,结合完整的热-力耦合分析流程,帮助工程师高效模拟SMP的形状记忆行为。文章还提供了工程应用案例和常见问题解决方案,为相关领域的研究和设计提供实用指导。 阅读详情

相关推荐

电力-平衡式IEC 60870-5-101规约报文解析

本文详细介绍了电力自动化中平衡式IEC 60870-5-101规约的应用,包括链路建立与初始化、对时、遥控操作、数据上送和总召唤等关键步骤,通过实例解析了报文格式和交互过程,是理解配网自动化通信的重要参考资料。

让你爱上电路设计 5684

994. 腐烂的橘子

丧尸围城:所有源头同时爆发,一圈一圈向外感染。这不是从一个点开始搜,而是从所有一开始就腐烂的橘子同时开始扩散。💡往湖里扔这几颗石头(腐烂橘子)。波纹(感染范围)同时向外扩散。问波纹覆盖所有水面(新鲜橘子)需要几秒。“生化危机模式:所有传染源同时向外爆发,利用‘双列表’交替模拟时间的流逝。多源 BFS:这不是从单一节点出发的搜索,而是将所有初始烂橘子视为“第 0 层”,它们在同一时刻向外扩散。层序遍历优化:您使用了List替换法 (tmp和q交替) 来代替传统的队列size。

一同进步 807

单细胞转录组数据分析全流程:从原始数据到细胞注释

本文详细介绍了单细胞转录组数据分析的全流程,从原始数据读取、环境搭建、数据质控与标准化,到降维聚类、细胞类型注释,以及高级质控与多样本整合。重点阐述了如何利用Seurat等工具进行数据处理,并通过标志基因比对与自动注释方法完成细胞身份鉴定,为研究者提供了一套清晰、可操作的分析指南。

coffee的博客 552

BFS_FloodFill_46 . 腐烂的橘子问题

本文介绍了使用BFS算法解决腐烂橘子问题。给定一个m×n网格,其中0表示空单元格,1表示新鲜橘子,2表示腐烂橘子。每分钟腐烂橘子会感染周围4个方向的新鲜橘子。我们需要计算所有橘子腐烂所需的最短时间,若无法全部腐烂则返回-1。算法步骤:1)统计初始腐烂橘子入队和新鲜橘子数量;2)使用BFS层次遍历,每轮处理当前所有腐烂橘子,感染周围新鲜橘子;3)每轮时间+1,直到没有新鲜橘子或队列为空。最终检查剩余新鲜橘子数量决定返回结果。时间复杂度O(mn),空间复杂度O(mn)。

2301_80682565的博客 612

基于Simulink/Matlab的VSG并网系统单相接地与相间短路故障仿真建模与特性分析

本文详细介绍了基于Simulink/Matlab搭建虚拟同步发电机(VSG)并网系统仿真模型的方法,并重点分析了单相接地与相间短路故障下的系统特性。通过设置三相故障模块参数,模拟了故障发生时的电压、电流变化及VSG动态响应,为理解故障机理、优化控制策略及设计继电保护提供了仿真依据与实践指导。

t8u9v0w1x的博客 514

[Dify] 如何构建一个带评分功能的 Dify AI 教练系统

本文介绍如何利用Dify开源平台构建具备自动评分功能的AI教练系统。系统通过Prompt设计AI教练角色,使用OpenAPI定义评分工具接口,结合工作流编排实现提问、回答收集、评分和反馈的全流程。文章详细讲解了从AI教练身份设定、多维度评分标准设计到前端可视化展示的实现方法,并提供了可扩展建议,适用于语言训练、面试模拟等多种场景。该系统展示了Dify平台在构建智能化评估应用方面的优势,实现零代码开发专业AI教练解决方案。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 333

leetcode994.腐烂的橘子

这里图中的腐烂的的橘子是同时对周围进行腐化,所以采用多源bfs就能解决。多源bfs与单源bfs的区别就在于队列取出时一轮是取出队列当中的全部元素。【力扣hot100】【LeetCode 994】腐烂的橘子|多源BFS。

weixin_74175349的博客 340

iStoreOS等软路由插件卸载的残留?分享一款软路由高级卸载工具,自定义卸载,轻松解决卸载残留问题

iStoreOS用户看过来!👀 还在被插件包残留困扰吗?本文分享一款“高级卸载”的插件,助你深度清理iStoreOS系统,彻底解决软件卸载不净的痛点,告别频繁恢复出厂设置的烦恼!🚀

XiaoqiangClub的博客 1540

994.腐烂的橘子

遍历整个网格:统计新鲜橘子数量fresh;把所有初始腐烂橘子的位置放进队列。队列中的一整层橘子,代表“同一分钟已经腐烂的橘子”。每处理完一层,时间minutes加一;这些橘子会让四个方向的新鲜橘子腐烂。BFS 结束后:fresh == 0:全部感染成功,返回经过的分钟数;fresh > 0:有新鲜橘子永远接触不到腐烂橘子,返回-1。图片正是在展示这个过程:Minute 0 的腐烂橘子入队,随后每一列的变化就是 BFS 的一层。

2501_92327848的博客 356

9、从统计到电路:未来物理不可克隆函数的基础

本文探讨了物理不可克隆函数(PUF)的关键技术,包括补偿环境影响、处理相关工艺变化、身份映射和测试方法。提出了一种基于新测试统计量Q的方法,有效提升了PUF的熵值和安全性。通过实验验证,新方法能够显著区分不同芯片,并增强PUF在不同环境下的适应性和可靠性,为未来PUF的设计与应用提供了重要基础。

pluto的博客 118

lammps教程:实例讲解npt、nvt系综的选择

对于lammps新手来说,系综的选择令人困惑,到底是应该用nvt系综还是npt系综? 我在初学lammps时就被这个问题困扰了很久。如果去问别人,可能会告诉你一个答案:根据模拟需要确定。 其实和没说一样。 到底如何确定系综,确实不是一句两句能够说清楚的,不同的体系、不同的模拟目的要选择不同的系综。 前几天遇到的一个合金的模拟案例,比较有代表性,分享出来供大家参考。 建模方法和之前介绍过的高熵合金建模方法类似,先建立单晶模型,然后使用替换原子的命令获得合金结构。 建模完成后,按照常规,先上nvt系综进行驰豫

lammps_jiayou的博客 9767

LeetCode 994. 腐烂的橘子

题目要求计算网格中所有新鲜橘子腐烂所需的最短时间。通过分析,发现DFS无法正确模拟每分钟同步扩散的过程,而多源BFS更适合解决此问题。具体思路为:将所有初始腐烂橘子加入队列,统计新鲜橘子数量;在BFS过程中按层次处理,每分钟扩散一次,直到没有新鲜橘子或无法继续扩散为止。代码实现时需注意队列初始化、分层处理以及最终新鲜橘子的检查。时间复杂度为O(mn),空间复杂度为O(mn)。关键点在于识别题目中的分层扩散特性,并采用多源BFS正确模拟同步腐烂过程。

zander258的博客 178

使用lighttpd和开发板进行交互

本文介绍了如何在嵌入式开发板上使用Lighttpd Web服务器实现硬件交互功能。主要内容包括:Lighttpd通过CGI程序间接控制硬件的基本原理;lighttpd.conf配置文件的详细解析;开发板文件目录结构设计;用C语言编写控制GPIO的CGI程序示例;网页调用CGI实现按钮触发控制的HTML代码;常见问题调试建议。最后通过效果图展示了网页按钮点击后成功控制LED灯的实际效果,验证了Lighttpd+CGI方案在嵌入式设备Web控制中的可行性。

m0_49476241的博客 1424

【一文搞懂多源 BFS 】 : LeetCode994. 腐烂的橘子

通常的 BFS 是从一个起点开始扩散。但在这道题中,初始状态下可能有多个腐烂的橘子(多个源头)。怎么办呢?很简单,我们只需要在 BFS 开始前,把所有初始状态为腐烂的橘子的坐标同时放入队列中。让它们作为第一层一起向外扩散,这样就能保证所有新鲜橘子被感染的时间是最短且正确的。“腐烂的橘子”是一道非常经典的 BFS 模板题。掌握这道题的关键在于理解多源 BFS的思想:将多个起始点同时放入队列,并利用分层遍历的特性来记录时间步数。

一个coder的博客 9305

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【算法面试必刷】994. 腐烂的橘子

重复直到没有新鲜橘子或无法继续感染(即某分钟后没有新橘子被感染,但仍有新鲜橘子存在)。,避免在同一分钟内重复感染(因为多个腐烂橘子可能感染同一个新鲜橘子,但只算一次)。每一分钟,所有已经腐烂的橘子会感染它们上下左右四个方向的新鲜橘子。994. 腐烂的橘子 - 力扣(LeetCode)然后统一将这些标记的橘子变为腐烂,并计时。使用一个临时标记数组。

qq_63119697的博客 363

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

HOT100--Day18--994. 腐烂的橘子,207. 课程表,208. 实现 Trie (前缀树)

HOT100–Day18–994. 腐烂的橘子,207. 课程表,208. 实现 Trie (前缀树) 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型:图。 关键:掌握BFS和DFS模板。前缀树是高频。

m0_60740070的博客 636

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【算法三十九】994. 腐烂的橘子

时间复杂度:O(MN)空间复杂度:O(MN)

IronMurphy的博客 189

Leetcode hot100-994 腐烂的橘子

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

qq_57277346的博客 39

Hot-994 腐烂的橘子

解法1: 坐标+资源 的 多资源 DFS。

xiao_ZHEDA的博客 194

LeetCode经典算法面试题 #994:腐烂的橘子(多源BFS、模拟扩散法等五种实现方案详细解析)

本文探讨了网格中橘子腐烂传播问题,采用多源BFS算法求解最短时间。问题描述为:网格中0表示空格,1表示新鲜橘子,2表示腐烂橘子,每分钟腐烂橘子会感染相邻四个方向的新鲜橘子。算法核心是将所有初始腐烂橘子作为BFS起点,进行层序遍历,每分钟处理当前层所有节点并感染相邻新鲜橘子。关键步骤包括统计初始新鲜橘子数量、队列初始化、方向处理和结果验证。时间复杂度为O(m×n),空间复杂度O(m×n)。文章提供了两种实现方式:标准层序遍历法和时间戳记录法,并分析了各自优缺点。

夏日清风 1322

JAVA练习320- 腐烂的橘子

我们可以先遍历一次,用队列记录所有腐烂橘子的位置,然后遍历队列,先记录队列大小作为第一层的橘子数,然后遍历所有第一层的橘子,让他们朝着上下左右腐烂,然后将腐烂的橘子入队列作为下一层的遍历。当队列的橘子清空时,层数就为腐烂次数,最后还要遍历依次整个数组,如果有新鲜橘子,返回 -1,否则返回腐烂次数、当我们遍历到另一个非被动腐烂的 烂橘子时,一样上下左右遍历,如果遇到被腐烂的格子,比较 time 和 从当前橘子腐烂所用次数,取最小的一个,如果 time < 当前橘子的 time,停止遍历。的新鲜橘子都会腐烂。

qq_48772498的博客 77

网格图--Day09--网格图BFS--542. 01 矩阵,1765. 地图中的最高点,994. 腐烂的橘子

今天的题目特点: 都是先找到第一层,标记,然后一层一层BFS就行了,同一个套路。 今天复杂的地方在于:找到可用的染色标记,一般0或者1原意都会是水陆,意义被占用。要么就是先标记成-1意为未访问。要么就直接使用visited数组。推荐使用visited数组,这样不容易出错。

m0_60740070的博客 631

【LeetCodehot100】 T200:岛屿数量 T994:腐烂的橘子

当我们找到第一个1时,我们开始判断四周有多少个1,如果是1.则全部将其改为0,count++。给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。queue.offer(…在判断过程中,我们使用DFS(深度优先搜索)此外,你可以假设该网格的四条边均被水包围。

2501_92547326的博客 405

力扣200.岛屿数量、994.腐烂的橘子

1、目标是找到矩阵中 “岛屿的数量” ,上下左右相连的 1 都被认为是连续岛屿。2、dfs方法: 设目前指针指向一个岛屿中的某一点 (i, j),寻找包括此点的岛屿边界。3、搜索岛屿的同时,执行 grid[i][j] = '0',即将岛屿所有节点删除,以免之后重复搜索相同岛屿。4、主循环:遍历整个矩阵,当遇到 grid[i][j] == '1' 时,从此点开始做深度优先搜索 dfs,岛屿数 count + 1 且在深度优先搜索中删除此岛屿。5、最终返回岛屿数 count 即可。

qq_66799283的博客 304

【LeetCode刷题笔记】DFS&BFS(二)

LeetCode刷题笔记之DFS&BFS篇(二)。

川峰的博客 1057

leetcode-hot100-图论:200岛屿数量-994腐烂的橘子-207课程表-208实现前缀树

图论:200岛屿数量-994腐烂的橘子-207课程表-208实现前缀树

XSYaaaaan的博客 319
上一篇: 【DFS】200.岛屿数量
下一篇: 【重点】【拓扑排序】207.课程表|210.课程表II
Allenlzcoder
博客等级 码龄10年 925粉丝 512原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值