LeetCode 0994.腐烂的橘子:广度优先搜索(BFS)

【LetMeFly】994.腐烂的橘子:广度优先搜索(BFS)

力扣题目链接:https://leetcode.cn/problems/rotting-oranges/

在给定的 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] 仅为 01 或 2

解题方法:BFS

首先将腐烂的橘子入队。(每个入队的橘子都被标记为0,假设坏掉消失了,反正它最多“往外感染一次”)

接着当队列非空时:

每次将队列中当前元素全部出队,并尝试向上下左右四个方向腐蚀一个橘子。

若腐蚀成功则新橘子入队(并标记为消失)

每轮腐蚀若成功则“腐蚀时间加一”,直至队列为空,判断是否还有完好的橘子。

  • 时间复杂度 O ( m n ) O(mn) O(mn)
  • 空间复杂度 O ( m n ) O(mn) O(mn)

不知本题数据范围为何这么小。

AC代码

C++
const int directions[4][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};class Solution {
public:int orangesRotting(vector<vector<int>>& grid) {int ans = 0;int cntNormal = 0;queue<int> q;for (int i = 0; i < grid.size(); i++) {for (int j = 0; j < grid[0].size(); j++) {if (grid[i][j] == 1) {cntNormal++;}else if (grid[i][j] == 2) {q.push(i * 10 + j);grid[i][j] = 0;}}}while (q.size()) {bool hasNew = false;for (int i = q.size(); i > 0; i--) {int x = q.front() / 10, y = q.front() % 10;q.pop();for (int d = 0; d < 4; d++) {int tx = x + directions[d][0], ty = y + directions[d][1];if (tx >= 0 && tx < grid.size() && ty >= 0 && ty < grid[0].size() && grid[tx][ty] == 1) {grid[tx][ty] = 0;q.push(tx * 10 + ty);cntNormal--;hasNew = true;}}}ans += hasNew;}return cntNormal ? -1 : ans;}
};
Python
# from typing import ListDIRECTIONS = [[0, -1], [0, 1], [-1, 0], [1, 0]]class Solution:def orangesRotting(self, grid: List[List[int]]) -> int:ans = 0cntNormal = 0q = []for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j] == 1:cntNormal += 1elif grid[i][j] == 2:q.append((i, j))grid[i][j] = 0while q:hasNew = FalsenewQ = []for x, y in q:for dx, dy in DIRECTIONS:newX, newY = x + dx, y + dyif newX >= 0 and newX < len(grid) and newY >= 0 and newY < len(grid[0]) and grid[newX][newY] == 1:newQ.append((newX, newY))grid[newX][newY] = 0cntNormal -= 1hasNew = Trueq = newQans += hasNewreturn -1 if cntNormal else ans

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/138802167

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

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

相关文章

vue+vant项目0-1快速发布到--钉钉应用

uniapp开发笔记----vue开发项目配置钉钉应用 一、 vuevant开发项目1. 自定义vuevant项目或者已经有的旧项目1. 自定义vuevant项目1. 创建vue项目2. 安装依赖3. 引入所有组件4. 使用一个组件/效果和代码如下&#xff1a; 2. git官网仓库&#xff0c;直接拉默认dome代码3. 打包项…

RS8551XF功能和参数介绍及PDF资料

RS8551XF是Runic&#xff08;润石&#xff09;公司生产的一款精密运算放大器。以下是关于RS8551XF的一些技术参数和特点&#xff1a; 类型&#xff1a;精密运算放大器 品牌&#xff1a;Runic&#xff08;润石&#xff09; 输入偏置电流&#xff1a;极低&#xff08;适合精密测量…

GRFB-UNet:一种新的多尺度注意力网络,用于铺路分割

不同场景下的带注释的触觉铺装示例: GRFB-UNet网络结构: GRFB模块的结构: 铺路在视障人士的旅行中起着至关重要的作用。因此,识别铺装的形状和位置以支持视障人士的移动性是相当有意义的,而视觉分割技术就适合这项任务。为了有效提高触觉铺装分割的精度和鲁棒性,…

AMEYA360:纳芯微推出高性价比的推挽变压器驱动NSIP605x系列,支持客户多样化灵活设计

纳芯微今日宣布推出高性价比的推挽变压器驱动NSIP605x系列。该系列包括输出功率为1W的NSIP6051和输出功率为5W的NSIP6055。其中&#xff0c;NSIP6055提供两个版本&#xff1a;开关频率为160kHz的NSIP6055A&#xff0c;可用于对EMI要求更严格的系统应用;以及开关频率为420kHz的N…

【云原生】Kubeadm搭建K8S

一、部署Kubernetes 实验环境 服务器主机名IP地址主要组件k8s集群master01 etcd01master01192.168.10.100kube-apiserver kube-controller-manager kube-schedular etcdk8s集群node01 etcd02node01192.168.10.101kubelet kube-proxy docker flannelk8s集群node02 etcd03nod…

项目分享|基于ELF 1S开发板完成的物联网开源项目

ElfBoard作为飞凌嵌入式旗下教育品牌&#xff0c;自成立以来&#xff0c;持续吸引着各界的瞩目&#xff0c;其中也赢得了一些工程师的青睐。今天&#xff0c;就和各位小伙伴分享一位杰出工程师借助ELF 1S开发板完成的嵌入式物联网项目&#xff0c;见证智慧与技术的火花。 关于…

Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!

前言 我们之前肯定已经见过了很多文本生成图片、文本生成声音以及AI翻唱歌曲 等多种AI产品&#xff08;模型&#xff09;。 其实音乐和图片从某种意义上来说都是艺术创作的一种形式&#xff0c;它们可以相互配合&#xff0c;共同呈现出一种更加丰富、感性的表达方式。 将图片…

全国大学生数学建模竞赛【集训营E题】丨 近5年赛题实现,模拟参赛体验

全国大学生数学建模竞赛E题集训营即将开营 基于Python的近5年E题数学建模基础巩固 近5年E题赛题实现 模拟参赛体验与作品评审

双星号(**)和单星号(*)在Python参数传递中的妙用

在Python中&#xff0c;参数传递是一个非常重要的概念&#xff0c;它允许函数接收任意数量的参数。而双星号(**)和单星号(*)在参数传递中扮演着关键角色。本文将详细讲解这两个符号的用法&#xff0c;并通过示例代码帮助初学者理解它们的工作原理。 单星号(*) 单星号(*)用于函…

MySQL_DDL语句

1.Data类临时数据的弊端 我们之前在将ServletJSP配合处理请求的过程中 数据库起到一个存取数据的作用 但是我们之前的案例中 数据是在Data类中临时定义的 并不是从数据库中获取的 这样做是不好的 因为每一次服务器关闭之后 那么部署在其上的类也会随着卸载 紧接着和类相挂钩的静…

气膜建筑为何能够建在楼顶—轻空间

近年来&#xff0c;随着体育设施建设的推进和政策支持&#xff0c;越来越多的体育从业者将目光聚焦到了楼顶&#xff0c;希望通过在楼顶加盖气膜馆来充分利用有限的土地资源。那么&#xff0c;为什么气膜建筑能够建在楼顶呢&#xff1f;轻空间将从气膜建筑的结构特点、安全性、…