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.mzph.cn/diannao/11388.shtml

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

相关文章

伴游平台app小程序功能介绍

伴游平台app小程序是一种基于移动端的解决方案&#xff0c;旨在为用户提供便捷的伴游服务。以下是一些常见的伴游平台app小程序的功能介绍&#xff1a; 注册登录功能&#xff1a;用户可以通过手机号或第三方社交账号注册登录&#xff0c;创建个人账号并完善个人信息&#xff0…

【Spring】GoF 之代理模式

一、代理模式 在 Java 程序中的代理模式的作用&#xff1a; 当一个对象需要受到保护的时候&#xff0c;可以考虑使用代理对象去完成某个行为 需要给某个对象的功能进行功能增强的时候&#xff0c;可以考虑找一个代理进行增强 A 对象无法和 B 对象直接交互时&#xff0c;也可以…

速盾:cdn转发循环攻击

CDN&#xff08;内容分发网络&#xff09;是一种用于加速和分发网络资源的技术。它通过将内容缓存到离用户最近的服务器上&#xff0c;从而减少响应时间和网络拥塞&#xff0c;提高用户体验。然而&#xff0c;CDN技术也存在一些安全风险&#xff0c;其中之一就是转发循环攻击。…

如何在 Python 中使变量不可继承

1. 问题背景 在 Python 中&#xff0c;子类可以继承父类的属性和方法。但是&#xff0c;有时我们希望子类不能继承父类的某些属性或方法。这种情况下&#xff0c;该如何做呢&#xff1f; 2. 解决方案 解决方案一&#xff1a;使用双下划线前缀 Python 中的双下划线前缀用于表…

仓库管理流程详解(附作业流程图)

仓库管理流程在企业的日常运营中至关重要。它不仅是物资流转的核心环节&#xff0c;更关乎着企业的运营效率、成本控制和客户服务水平。一个高效、规范的仓库管理流程能够确保货物从入库到出库的各个环节有序进行&#xff0c;减少资源浪费和时间成本&#xff0c;同时帮助企业实…

一般可以用哪些值作为key?如果用索引值作为key 会出现什么样的问题?

在React中&#xff0c;key是一个特殊的属性&#xff0c;它主要用于帮助React识别哪些元素发生了变化、被添加或被移除。当在列表&#xff08;如数组&#xff09;中渲染元素时&#xff0c;为每一个元素提供一个唯一的key会非常有帮助。 一般来说&#xff0c;key的值可以是以下几…

基于python的大麦网自动抢票工具的设计与实现

基于python的大麦网自动抢票工具的设计与实现 Design and Implementation of Da Mai Net Ticket Grabbing tool based on Python 完整下载链接:基于python的大麦网自动抢票工具的设计与实现 文章目录 基于python的大麦网自动抢票工具的设计与实现摘要第一章 引言1.1 研究背景…

Hive Sampling 抽样函数

Hive Sampling 抽样函数 1.random随机抽样 2.数据块抽样 3.分桶表抽样

bat脚本添加防火墙端口

echo off setlocal:: 设置需要开放的端口号 set PORT****:: 设置规则名称 set RULENAMEAllow_%PORT%:: 添加防火墙规则 netsh advfirewall firewall add rule name"%RULENAME%" dirin actionallow protocoltcp localport%PORT%echo Port %PORT% has been added to Wi…

vue3获取原始值

在 Vue 3 中&#xff0c;_rawValue 是 ref 内部的一个属性&#xff0c;它用来存储 ref 的原始值&#xff0c;也就是未经响应式处理的值。这个属性主要用于 Vue 的内部逻辑&#xff0c;以帮助区分 ref 的当前值 (value) 和原始输入值 (_rawValue)。对于大多数开发者来说&#xf…

LabVIEW控制多个同样的串口设备,有什么好的办法

如果所有的串口设备操作完全相同&#xff0c;且只涉及读取信息&#xff0c;那么可以采用更加简化的方法来组织你的LabVIEW程序&#xff0c;确保其易于编写、修改和维护。针对这种情况&#xff0c;推荐使用多线程处理与事件驱动编程结合的方式&#xff0c;或者直接采用并行循环&…

Python创建可点击网页

继完成静态网页后&#xff0c;引入java script制作动态交互网页&#xff0c;交互逻辑就两个按钮&#xff0c;用于学习网页编程。 from flask import Flask, render_template_string, jsonify, requestapp Flask(__name__)app.route(/) def index():# 使用内联模板渲染一个简单…

【静态分析】软件分析课程实验A2-常量传播和Worklist求解器

Tai-e官网&#xff1a; 概述 | Tai-e 参考&#xff1a; https://www.cnblogs.com/gonghr/p/17979609 -------------------------------------------------------- 1 作业导览 为 Java 实现常量传播算法。实现一个通用的 worklist 求解器&#xff0c;并用它来解决一些数据…

超便捷备忘录共享方法 文字文件都可共享

在这个信息爆炸的时代&#xff0c;备忘录已成为我们生活中不可或缺的小助手。它记录着我们的工作计划、待办事项、灵感闪现&#xff0c;甚至是那些温馨的家庭琐事。然而&#xff0c;当我们在不同的设备间穿梭&#xff0c;如何在手机、电脑&#xff0c;甚至是不同品牌的手机之间…

理解机器学习中的类别不平衡问题

大家好&#xff0c;实际世界的数据集通常是杂乱的,当不同类别之间的样本分布不均匀时&#xff0c;就会出现类别不平衡。或者说&#xff0c;某些类别的样本比其他类别多得多。例如&#xff0c;考虑一个信用卡违约数据集&#xff0c;信用卡违约是一个相对较少发生的事件&#xff…

速锐得深入解析吉利几何CAN总线数据通信网络的拓扑层级框架技术

在现代汽车工业中&#xff0c;车辆的电子控制单元&#xff08;ECU&#xff09;之间的通信至关重要。这种通信大多通过控制器局域网络&#xff08;CAN&#xff09;总线实现&#xff0c;它是德国BOSCH公司于20世纪80年代初开发的一种串行数据通信协议。随着技术的不断进步&#x…

读人工智能时代与人类未来笔记01_重塑人类社会秩序

1. AlphaZero 1.1. 2017年年底&#xff0c;由谷歌旗下DeepMind公司开发的人工智能程序AlphaZero击败了当时世界上最强大的国际象棋程序Stockfish 1.1.1. AlphaZero对Stockfish的百场战绩是28胜72平0负&#xff0c;可以说获得了压倒性的胜利 1.1.2. …

外贸网站优化为什么要布置内部链接?如何优化内链?

对于外贸人来说&#xff0c;外贸网站优化已然成为推广引流、获取询盘的重要的一环。而除了外部优化&#xff0c;内部链接&#xff0c;实际上也是提升SEO效果和用户体验的重要手段。为什么这么说呢&#xff1f;内部链接又该如何进行优化呢&#xff1f;接下来一起来看一看吧~ 什…

安卓手机数据恢复全攻略:从备份到专业软件一网打尽!

随着科技的飞速发展&#xff0c;我们的生活中越来越离不开手机。然而&#xff0c;在使用手机的过程中&#xff0c;我们可能会遇到数据丢失的问题。对于安卓手机用户来说&#xff0c;如何有效地恢复丢失的数据是一个值得探讨的问题。本文将为您介绍安卓手机数据恢复的全攻略&…

市政道路工程乙级资质的资质维护策略

人员配置与持续培训&#xff1a; 定期审查技术人员队伍&#xff0c;确保注册工程师及其他专业技术人员的数量、资质和专业分布满足乙级资质要求。实施持续的职业发展计划&#xff0c;包括内部培训、外部进修和专业认证&#xff0c;提升团队的技术水平和行业知识。 工程业绩记录…