Leetcode 994. 腐烂的橘子

在这里插入图片描述

心路历程:

一开始以为和刚做过的岛屿问题很像,只不过是把岛屿问题换成BFS去做,然后再加上一些计数的规则。结果做完后发现只能通过一半左右的测试用例,发现有一个逻辑错误在于,当腐烂的橘子位于两端时,可以共同腐蚀从而加速进程。而依次遍历所有grid再分别去BFS的顺序思路很明显就不行了。从网上搜素了一下相关的解题思路,发现可以按照多点开花的BFS来做这道题,感觉这样更有图的味道了。
这道题对我来说其实是一道困难题。

注意的点:

1、BFS中队列的本质是一层一层,但是并不一定根结点只有一个,所以可以先把所有腐烂的根结点拿到放到队列中再去一层层地遍历。
2、只有当某一层至少有一个好橘子被腐蚀时,才应该计数+1,否则代表这一圈全是坏橘子不需要占用腐蚀时间。
3、本题可以通过判断全部腐蚀完成后看好橘子是否还剩下来判断是否全部腐蚀完成,否则就是有孤立的橘子。并不一定非要按照岛屿问题那样遍历出所有孤立的岛屿才计数。
4、注意本题要求的是整数类型的1,不是字符串类型的“1”。
5、if else后的语句只有一行时写到一起更简洁。
6、发现队列这种数据结构在用于搜索时可以作为’假并行‘,但是递归的DFS不行,想了想用一个栈实现的DFS好像也不能做到这种类似的并行深度优先搜索。本质还是在于队列的顺序在即使有不同根节点时也是可以累加放到一起同时操作的。

解法:BFS+多点并行处理

class Solution:def orangesRotting(self, grid: List[List[int]]) -> int:# BFS + 并行同时仿真扩散from collections import dequem, n = len(grid), len(grid[0])dxy = [(0,1), (0,-1), (1,0), (-1,0)]bads = deque([])goodnum = 0for i in range(m):  # 获取所有坏橘子的坐标和好橘子的数量for j in range(n):if grid[i][j] == 1: goodnum += 1elif grid[i][j] == 2: bads.append((i,j))if goodnum == 0: return 0time = 0while bads:  # 每一层只传播好橘子,入队规则:只有好橘子才入队l = len(bads)level = 0  # 判断这一层是否有好橘子被感染for _ in range(l):bx, by = bads.popleft()for dx, dy in dxy:newx, newy = bx + dx, by + dyif 0 <= newx <= m-1 and 0 <= newy <= n-1 and grid[newx][newy] == 1:bads.append((newx, newy))level = 1grid[newx][newy] = 2goodnum -= 1time += levelif goodnum != 0:  # 这一点很关键,与前面事先统计了好橘子的数量相呼应。time = -1return time 

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

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

相关文章

课时71:流程控制_for循环_综合案例

2.4.5 综合案例 学习目标 这一节&#xff0c;我们从 信息收集、其他实践、小结 三个方面来学习。 信息收集 案例需求 根据提示信息&#xff0c;选择输出 cpu 或者 内存信息。脚本实践-采集系统负载信息 查看脚本内容 [rootlocalhost ~]# cat systemctl_load.sh #!/bin/bas…

C#探索之路基础篇(2):接口Interface的概念、实现、应用范围

文章目录 1 概念2 示例代码&#xff1a;2.1 简单接口的实现2.2 简单的使用接口2.3 使用接口呈现多态性2.4 通过接口实现一个数组迭代器2.5 通过接口来实现松耦合的关系2.6 使用接口实现可扩展、便利性 3 使用范围与时机4 注意事项 不知道大家在学习的过程中&#xff0c;有没有反…

基于Springboot的个人博客系统的设计与实现

目录 1. 第5章 数据库设计 1.1. 数据库概念设计 1.1.1. 用户信息实体 1.1.2. 文章信息实体 1.1.3. 评论信息实体 1.1.4. 附件信息实体 1.1.5. 类别信息实体 1.1.6. 日志信息实体 1.2. 数据库表结构设计 基于Springboot的个人博客系统的设计与实现 第5章 数据库设计 …

笔试总结01

1、spring原理 1、spring原理 spring的最大作用ioc/di,将类与类的依赖关系写在配置文件中&#xff0c;程序在运行时根据配置文件动态加载依赖的类&#xff0c;降低的类与类之间的藕合度。它的原理是在applicationContext.xml加入bean标记,在bean标记中通过class属性说明具体类…

148 Linux 网络编程4 ,高并发服务器 --多路I/O转接服务器 - poll 这个非重点,

Poll 的实现和 select 很像。 实际上poll 的核心就是我们select的优化版本&#xff0c;加入了一个数组&#xff0c; 还将传入传出参数分离开了 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);fds &#xff1a;需要监听的--文件描述符数组…

数据挖掘|数据集成|基于Python的数据集成关键问题处理

数据挖掘|数据集成|基于Python的数据集成关键问题处理 1. 实体识别2. 数据冗余与相关性分析3. 去除重复记录4. 数据值冲突的检测与处理5. 基于Python的数据集成5.1 merge()方法5.2 Concat()方法 数据集成是把来自多个数据库或文件等不同数据源的数据整合成一致的数据存储。其中…

基于docker创建深度学习开发环境

基于docker创建深度学习开发环境 记录几个链接 第一步&#xff1a;配置docker环境&#xff0c;此处大把教程&#xff0c;不再赘述第二步&#xff1a;拉取nvidia做好的cuda和cudnn镜像&#xff1a; docker pull nvcr.io/nvidia/cuda:12.2.0-devel-ubuntu20.04如果有其他需求&a…

vue3+threejs新手从零开发卡牌游戏(二):初始化场景

在删掉初始化中一些没用的代码后&#xff0c;在views目录下新建game文件夹&#xff0c;在里面新建一个index.vue&#xff0c;这里就当成游戏的主入口。 目录结构如下&#xff1a; 下面开始尝试创建场景&#xff1a; 一、添加一个div作为threejs的画布对象&#xff0c;之后整个…

ubuntu - 编译 linphone-sdk

业务需求需要定制sdk&#xff0c;首先声明我们需要的是在Android4.4上跑的sdk&#xff0c;因此本次编译的sdk最低支持为19&#xff08;不同版本需要的环境不一致&#xff09;&#xff0c;编译过程较容易&#xff0c;难点在于环境配置 环境准备 Ubuntu 18.04.6 android-sdk_r24.…

mysql分页查询多用GitCode平台

目录 一、在GitCode平台AI搜索结果&#xff08;这个更优&#xff09; 二、在百度搜索输入“mysql Java分页查询”的输出结果&#xff1a; 三、推荐的文章 四、GitCode的使用 1&#xff09;如搜索jdk11可以直接下载jdk11的包 2&#xff09;搜索开源项目 3&#xff09;如搜…

3.21 ARM day5

串口控制LED灯亮灭 main.c #include "uart4.h"int main() {//串口初始化uart4_init();//led初始化led_init();char i;int count 0;int count2 0;int count3 0;while (1){i getchar();putchar(i);//键盘输入a&#xff0c;串口工具显示aif (i 1){count;if (coun…

步进电机驱动器的接线与使用(接线详细)

今天小编就来继续学习与使用步行电机的学习&#xff0c;如果位置对你有帮助&#xff0c;评论收藏&#xff0c;点赞一下 步进电机驱动器 步进电机驱动器是一种专用于控制步进电机的电子设备&#xff0c;用于控制步进电机的转动和位置。步进电机是一种将电信号转换为机械运动的电…

Compose UI 之 Segmented buttons 分段按钮

Segmented buttons SegmentedButton 是一种分段式按钮组件,它允许用户在一组相关的选项中选择一个或几个。 上图中:① 单选的分段式按钮。② 多选的分段式按钮。 分段式按钮的几个特点: 分段式按钮是带有状态的按钮,又有单选和多选之分。 从设计上将,不论是单选或是多选…

第二十九章 配置 Web Gateway 的默认参数 - 与 IRIS 的连接(二)

文章目录 第二十九章 配置 Web Gateway 的默认参数 - 与IRIS 的连接(二)Event Log Rotation SizeMaximum Logged Request SizeSSL/TLS Library PathPreserve Mode Exclude File Types 第二十九章 配置 Web Gateway 的默认参数 - 与IRIS 的连接(二) Event Log Rotation Size 这…

fastjson2 反序列化包含多层泛型结构的实体类

前言 由于使用到httpUtill来调用接口 工具类的返回是字符串 其中接口的实现返回值是个多层泛型结构的实体类 例如Result<Page<UserDto>> 当使用 JSON.parseObject("res",new TypeReference<Result<Page<UserDto>>>{})发现在page中存在…

【GPT概念-03】:人工智能中的注意力机制

说明 注意力机制生成分数&#xff08;通常使用输入函数&#xff09;&#xff0c;确定对每个数据部分的关注程度。这些分数用于创建输入的加权总和&#xff0c;该总和馈送到下一个网络层。这允许模型捕获数据中的上下文和关系&#xff0c;而传统的固定序列处理方法可能会遗漏这…

QT(19)-QNetworkRequest

attribute(QNetworkRequest::Attribute code, const QVariant &defaultValue QVariant()) const 获取指定的请求属性。如果该属性未设置&#xff0c;则返回默认值。 hasRawHeader(const QByteArray &headerName) const 检查是否存在指定名称的原始请求头。 header(Q…

虚拟机扩展:虚拟机快照

虚拟机快照 在学习阶段我们无法避免的可能损坏Linux操作系统。如果损坏的话&#xff0c;重新安装一个Linux操作系统就会十分麻烦。 那我们就可以通过快照将当前虚拟机的状态保存下来&#xff0c;在以后系统损坏时通过快照恢复虚拟机到保存的状态。 制作并还原快照 在VMware …

静态方法 static foo()

静态方法&#xff08;Static Method&#xff09;是编程语言中的一种特殊方法&#xff0c;其特点是不依赖于类的实例即可被调用。在C和许多其他面向对象的编程语言中&#xff0c;静态方法通过类名来直接调用&#xff0c;而无需创建类的实例。这些方法属于类本身&#xff0c;而不…

数据结构(二)队列和栈

Java提供了java.util.Stack类来表示栈数据结构。Stack类是Vector类的子类&#xff0c;它实现了一个标准的后进先出&#xff08;LIFO&#xff09;栈。同样也提供了Queue接口&#xff0c;表示一系列按照特定顺序排列的元素&#xff0c;其中最早添加的元素将最先被移除&#xff08…