每日一练:腐烂的橘子

news2024/12/27 11:10:33

994. 腐烂的橘子 - 力扣(LeetCode)

题目要求:

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

解法-1 双队列实现广度优先 O(N)

        这是一道经典的广度优先遍历题,我们可以用两个队列q1和q2。

        先遍历数组得到初始的所有腐烂的橘子的坐标,放到q1中,

        然后对q1进行枚举,搜索队头坐标的上下左右坐标的橘子是不是好橘子,如果是就用infect函数"感染"这个橘子,并把它的坐标加入q2中,

        最后如果q2为空说明没有再被"感染"的橘子了,退出循环;否则time++,然后把q1 = q2,q2置空,

        最后遍历数组,如果有1,它就是永远不能感染的好橘子,返回-1;否则返回time。

class Solution {
    void infect(vector<vector<int>>& grid,int j,int i)
    {
        if(j >= grid.size() || i >= grid[0].size())
        {
            return;
        }
        if(grid[j][i] == 1)
        {
            grid[j][i] = 2;
            q2.push({j,i});
        }
    }
public:
    int orangesRotting(vector<vector<int>>& grid) {
        for(int i = 0;i < grid[0].size();i++)
        {
            for(int j = 0;j < grid.size();j++)
            {
                if(grid[j][i] == 2) // 初始的腐烂橘子
                {
                    q1.push({j,i});
                }
            }
        }

        int time = 0;
        while(!q1.empty())
        {
            while(!q1.empty())
            {
                int j = q1.front().first;
                int i = q1.front().second;
                q1.pop();
                infect(grid,j+1,i);
                infect(grid,j-1,i);
                infect(grid,j,i+1);
                infect(grid,j,i-1);
            }
            if(!q2.empty())
                time++;
            q1 = q2;
            q2 = queue<pair<int,int>>();
        }
        // 找好橘子
        for(int i = 0;i < grid[0].size();i++)
            for(int j = 0;j < grid.size();j++)
            {
                if(grid[j][i] == 1)
                    return -1;
            }
        return time;
    }
private:
    queue<pair<int,int>> q1;
    queue<pair<int,int>> q2;
};

        优化:只使用一个队列

        在遍历q1时,先得到q1的元素个数,循环就执行元素个数次即可:

class Solution {
    void infect(vector<vector<int>>& grid,int j,int i)
    {
        if(j >= grid.size() || i >= grid[0].size())
        {
            return;
        }
        if(grid[j][i] == 1)
        {
            grid[j][i] = 2;
            q.push({j,i});
        }
    }
public:
    int orangesRotting(vector<vector<int>>& grid) {
        for(int i = 0;i < grid[0].size();i++)
        {
            for(int j = 0;j < grid.size();j++)
            {
                if(grid[j][i] == 2) // 初始的腐烂橘子
                {
                    q.push({j,i});
                }
            }
        }
        int time = 0;
        while(!q.empty())
        {
            int size = q.size();
            while(size--) // 执行当前元素个数次
            {
                int j = q.front().first;
                int i = q.front().second;
                q.pop();
                infect(grid,j+1,i);
                infect(grid,j-1,i);
                infect(grid,j,i+1);
                infect(grid,j,i-1);
            }
            if(q.size()>0)
                time++;
        }
        for(int i = 0;i < grid[0].size();i++)
            for(int j = 0;j < grid.size();j++)
            {
                if(grid[j][i] == 1)
                    return -1;
            }
        return time;
    }
private:
    queue<pair<int,int>> q;
};

        内存优化:可以将调用infect函数改为使用4个if,节约空间

if((j+1 < grid.size() && i < grid[0].size()) && grid[j+1][i] == 1)
                {
                    grid[j+1][i] = 2;
                    q.push({j+1,i});
                }
if((j-1 < grid.size() && i < grid[0].size()) && grid[j-1][i] == 1)
                {
                    grid[j-1][i] = 2;
                    q.push({j-1,i});
                }
if((j < grid.size() && i+1 < grid[0].size()) && grid[j][i+1] == 1)
                {
                    grid[j][i+1] = 2;
                    q.push({j,i+1});
                }
if((j < grid.size() && i-1 < grid[0].size()) && grid[j][i-1] == 1)
                {
                    grid[j][i-1] = 2;
                    q.push({j,i-1});
                }

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

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

相关文章

leetcode35--搜索插入位置--二分查找刷题

搜索插入位置 一共会出现下面四种情况&#xff1a; 目标值在数组所有元素之前 目标值等于数组中某一个元素 目标值插入数组中的位置 目标值在数组所有元素之后 首先在二分查找的代码之前处理掉目标值在数组所有元素之前和之后的情况如果目标值在数组中的某个位置&#xff0c…

51单片机系列-按键检测原理

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 独立按键是检测低电平的。 下面我们来看一张对应的电路原理图&#xff1a; 在这张图当中&#xff0c;P1&#xff0c;P2&#xff0c;P3内部都上拉了电阻&#xff0c;但是P0没有&am…

学习记录:js算法(四十九):二叉树的层序遍历

文章目录 二叉树的层序遍历网上思路队列循环 总结 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 图一&#xff1a; 示例 1&#xff1a;如图一 输入&#xff1a;roo…

【QT】亲测有效:“生成的目标文件包含了过多的段,超出了编译器或链接器允许的最大数量”错误的解决方案

在使用dlib开发人脸对齐功能时&#xff0c;出现了”生成的目标文件包含了过多的段&#xff0c;超出了编译器或链接器允许的最大数量的错误“。 主要功能代码如下&#xff1a; #include <QApplication> #include <QImage> #include <QDebug>#include <dlib…

叶绿素透射反射率与波长

本文在分析巢湖水体反射光谱特征的基础上,通过对光谱反射率与叶绿素a 的浓度之间的关系进行分析研究,结果表明,单波段光谱反射率与叶绿素a浓度的相关系数较小,不宜用于估算叶绿素a浓度&#xff0e;光谱反射率比值RFo5.m/Rss.nm.和 690nm反射率的一阶微分均与叶绿素a浓度有较好的…

leetcode每日一题day16(24.9.26)——数组元素和与数字和的绝对差

思路&#xff1a;遍历数组在对数组元素进行求和时并使用while循环求数字和&#xff0c;由于对于一个数&#xff0c;其必定大于其个数位数字的和,所以可以直接对sum进行减 代码 int differenceOfSum(vector<int>& nums) {int ans 0;for (int x : nums) {ans x; // …

基于Springboot+Vue的玩具租赁系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

OpenSCAP部署、使用与原理分析

文章目录 前言1、概述2、安装与使用2.1、源码安装2.1.1、获取源代码2.1.2、获取构建依赖项2.1.3、构建库2.1.4、构建HTML文档2.1.5、运行测试2.1.6、安装OpenSCAP2.1.7、安装SCAP内容 2.2、使用方法2.2.1、oscap的常用命令2.2.2、显示有关SCAP内容的信息2.2.2.1、显示有关SCAP源…

WITS核心价值观【创新】篇|系统进化论 解锁新纪元

「客尊」、「诚信」、「创新」 与「卓越」 是纬创软件的核心价值观。我们秉持诚信态度&#xff0c;致力于成为客户长期且值得信赖的合作伙伴。持续提升服务厚度&#xff0c;透过数字创新实践多市场的跨境交付&#xff0c;助客户保持市场领先地位。以追求卓越的不懈精神&#xf…

【Python报错已解决】 WARNING: Ignoring invalid distribution

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

【JavaSE】反射、枚举、lambda表达式

目录 反射反射相关类获取类中属性相关方法常用获得类相关的方法示例常用获得类中属性相关的方法示例获得类中注解相关的方法 反射优缺点 枚举常用方法优缺点 枚举与反射lambda表达式语法函数式接口简化规则使用示例变量捕获集合中的应用优缺点 反射 Java的反射&#xff08;refl…

数据分析-30-电影死亡笔记中的数据分析思维

文章目录 1 死亡笔记简介2 推理过程中的数据分析2.1 第一个问题2.2 第二个问题2.3 第三个问题3 数据分析的发展4 参考附录1 死亡笔记简介 《死亡笔记》改编自小畑健同名日本人气漫画《Death note》,故事描述拥有一本写上姓名就能将人置于死地笔记本的高中生夜神月与天才警部搜…

人工智能迭代产品有哪些

人工智能迭代产品有很多&#xff0c;以下是一些例子&#xff1a; Ai 智能办公利器 - Ai-321.com 人工智能 - Ai工具集 - 集合全球ai人工智能软件的工具箱网站 Midjourney&#xff1a;这是一款基于AI技术的文生图产品&#xff0c;可以通过简单的prompt生成独具艺术感的 Midjo…

工具按钮 QToolButton

工具按钮常常用来显示图标&#xff0c;然后添加到工具栏中 常用属性和方法 文本 设置和获取文本 //设置和获取文本 QString text() const void setText(const QString &text)图片 设置和获取图片 //设置和获取图片 QIcon icon() const void setIcon(const QIcon &…

【STM32单片机_(HAL库)】4-0【定时器TIM】定时器中断配置步骤

定时器工作原理 定时器计数模式 定时器溢出时间计算 定时器中断实验配置步骤 msp 函数是对 MCU 相关的硬件进行初始化设置&#xff0c;通常被设计用于处理特定硬件外设或功能的底层初始化工作。

Spring Boot驱动的足球青训俱乐部管理解决方案

1 绪论 1.1研究背景 随着科技的发展&#xff0c;计算机的应用&#xff0c;人们的生活方方面面都和互联网密不可分。计算机的普及使得人们的生活更加方便快捷&#xff0c;网络也遍及到我们生活的每个角落&#xff0c;二十一世纪信息化时代的到来&#xff0c;随着社会科技的不断…

Python地理数据处理 27:基于Arcpy批量处理已矫正的worldclim2.1未来气候数据——投影、重采样、多波段拆分以及裁剪

Arcpy批量处理已矫正的worldclim2.1未来气候数据 1. 写在前面2.实现代码 1. 写在前面 前面我写了一篇关于如何使用ArcGIS自带的Python工具处理worldclim数据的多波段数据的文章&#xff0c;而这只是处理该数据的其中一步。要想得到满足要求的数据&#xff0c;还需要其他操作&am…

自闭症寄宿学校 vs. 日常教育:为孩子提供更多可能

在探索自闭症儿童的教育路径时&#xff0c;家长们往往面临一个重大的选择&#xff1a;是选择传统的日常教育环境&#xff0c;还是寻找专为自闭症儿童设计的寄宿学校&#xff1f;广州的星贝育园自闭症儿童寄宿制学校&#xff0c;以其独特的教育模式和全方位的关怀体系&#xff0…

大数据毕业设计选题推荐-个性化图书推荐系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

python中的find函数怎么用

Python find() 方法检测字符串中是否包含子字符串 str &#xff0c;如果指定 beg&#xff08;开始&#xff09; 和 end&#xff08;结束&#xff09; 范围&#xff0c;则检查是否包含在指定范围内&#xff0c;如果包含子字符串返回开始的索引值&#xff0c;否则返回-1。 语法 …