力扣994. 腐烂的橘子(DFS)

news2025/1/11 0:04:39

Problem: 994. 腐烂的橘子

文章目录

  • 题目描述
  • 思路及解法
  • 复杂度
  • Code

题目描述

在这里插入图片描述在这里插入图片描述

思路及解法

1.定义一个二维矩阵dp初始化每个元素值为矩阵的行数乘以列数;用于记录每个新鲜橘子距离第一个腐烂橘子的最早的腐烂时间;
2.遍历矩阵grid若当前橘子是腐烂的橘子,则调用dfs函数;
3.dfs函数实现:void dfs(int depth, vector<vector>& grid, int i, int j);每个参数的意义见代码注释!!!

3.1 若当前索引下标越界或者当前位置没有橘子(grid[i][j] == 0),或者当前橘子距离第一腐烂的橘子的腐烂时间大于或等于其距离第一腐烂的橘子最短腐烂时间(depth >= dp[i][j])则终止递归;
3.2 每次更新当前的新鲜橘子距离第一个腐烂橘子的最早的腐烂时间;
3.3 dfs当前位置新鲜橘子的上、左、下、右四个方向的橘子;

4.遍历dp数组更新所有橘子腐烂的最短时间(具体操作看代码!!!)

复杂度

时间复杂度:

O ( M × N ) O(M \times N) O(M×N);其中 M M M为矩阵grid的行数, N N N为矩阵grid的列数

空间复杂度:

O ( M × N ) O(M \times N) O(M×N)

Code

class Solution {
    //Minimum storage time
    vector<vector<int>> dp;
public:
    /**
     * Get the minimum orange decay time
     *
     * @param grid A matrix for storing the state of an orange
     * @return int
     */
    int orangesRotting(vector<vector<int>>& grid) {
        int minutes = 0;
        int m = grid.size();
        int n = grid[0].size();
        dp = vector(m, vector<int>(n, m * n));
        int res = 0;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 2) {
                    dfs(0, grid, i, j);
                }
            }
        }
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] != 0) {
                    res = max(dp[i][j], res);
                }
            }
        }
        return res == m * n ? -1 : res;
    }

    /**
     * DFS function implementation
     * 
     * @param depth Record the minimum decay time of the orange in the current location
     * @param grid A matrix for storing the state of an orange
     * @param i Index subscript
     * @param j Index subscript
     */
    void dfs(int depth, vector<vector<int>>& grid, int i, int j) {
        if (i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] == 0 || depth >= dp[i][j]) {
            return;
        }
        dp[i][j] = min(depth, dp[i][j]);
        dfs(depth + 1, grid, i - 1, j);
        dfs(depth + 1, grid, i, j - 1);
        dfs(depth + 1, grid, i + 1, j);
        dfs(depth + 1, grid, i, j + 1);
        return;
    }
};

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

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

相关文章

Redis中的缓存雪崩

缓存雪崩 &#x1f914;现象分析 缓存雪崩是指在同一时段大量的缓存key同时失效或者缓存服务(Redis等)宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 &#x1f44a; 解决方案 利用Redis集群提高服务的可用性&#xff0c;避免缓存服务宕机给缓存业务添…

2001-2023年中国各省市级是否属于“开通高铁”城市匹配数据

2001-2023年中国各省市级是否属于“开通高铁”城市匹配数据 1、时间&#xff1a;2001-2023年 2、范围&#xff1a;300个地级市&#xff08;包括直辖市&#xff09; 3、来源&#xff1a;历年中国铁道出版社出版的《全国铁路旅客列车时刻表》 4、用途&#xff1a;高铁开通可作…

53、Qt/信号与槽、QSS界面设计20240322

一、使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…

Python正则表达式之边界字符你学会了吗?

今天来学习Python正则表达式中的边界字符&#xff0c;它简直就是字符串处理的神器&#xff01;不知道大家有没有遇到过这样的场景&#xff1a;在一大段文字里&#xff0c;你需要找到某个特定的单词或模式&#xff0c;但是又不希望匹配到它的部分出现&#xff1f;这时候&#xf…

SQPSK

文章目录 [1]张显辉,沈国松.SQPSK调制体制在跟踪与数据中继卫星中的应用[J].遥测遥控,2007(S1):26-29.[2]保骏.QPSK、SQPSK信号解调相位模糊及其对Viterbi译码的影响[J].四川兵工学报,2011,32(03):53-55.[3]赵辉,严晓芳,张玉. 星载SQPSK高速调制系统的设计[C]//中国通信学会.20…

基于springboot学生心理咨询评估系统(含源文件)

&#xff08;源码附文章底部&#xff09; 摘 要 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在学生心理咨询评估信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数…

vue学习日记14:工程化开发脚手架Vue CLI

一、概念 二、安装 1.全局安装&查看版本 注意启动cmd输入命令 要以管理员运行哦 安装了一次就行以后不用再创建了 yarn global addvue/cli vue --version 显示了版本号即可 2.创建项目架子 创建项目的路径在哪 项目就在哪 项目名字不能用中文 vue create project-n…

什么是485数据采集模块?

在工业自动化、智能楼宇、环境监测等众多领域&#xff0c;数据的采集与传输是实现智能化管理的关键。而485数据采集模块&#xff0c;作为一种高效、稳定的数据采集设备&#xff0c;正日益受到广泛关注。HiWoo Box&#xff0c;作为一款卓越的485数据采集模块&#xff0c;以其强大…

Python中错误和异常的区别你搞清楚了吗?

​ 在Python编程的世界里&#xff0c;错误&#xff08;Error&#xff09;和异常&#xff08;Exception&#xff09;都是用来处理运行时出现的问题的。但它们之间有着微妙的差别&#xff0c;今天我们就来弄清楚。 错误&#xff08;Error&#xff09;通常指的是那些更严重、不可…

[小程序开发] 分包加载

一、介绍 分包加载是一种小程序的优化技术&#xff0c;将小程序不同功能的代码&#xff0c;分别打包成不同的子包&#xff0c;在构建时打包成不同的分包&#xff0c;用户在使用时按需进行加载&#xff0c;在构建小程序分包项目时&#xff0c;构建会输出一个或多个分包&#xff…

搜索二维矩阵

题目链接 搜索二维矩阵 题目描述 注意点 每行中的整数从左到右按非严格递增顺序排列每行的第一个整数大于前一行的最后一个整数1 < matrix.length, matrix[0].length < 100 解答思路 先二分查找找到target所处的行&#xff0c;找到行后再二分查找找到target所处的列…

OpenHarmony实现一次开发多端部署分布式新闻客户端页面

分布式新闻客户端&#xff08;ArkTS&#xff09; 介绍 本篇Codelab基于栅格布局、设备管理和多端协同&#xff0c;实现一次开发&#xff0c;多端部署的分布式新闻客户端页面。主要包含以下功能&#xff1a; 展示新闻列表以及左右滑动切换新闻Tab。点击新闻展示新闻详情页。点…

防范IP地址被攻击的五种措施

IP地址被攻击是网络安全领域的一个常见问题&#xff0c;它可能导致数据泄露、网络瘫痪、恶意软件传播等一系列严重后果。为了保护网络安全&#xff0c;我们需要采取一系列防范措施。以下是五种有效的防范方法&#xff1a; 首先&#xff0c;加强个人设备的安全防护至关重要。我们…

使用npm创建一个全局的cli命令,就像vue-cli一样

我们用过vue-cli等工具包&#xff0c;全局安装之后&#xff0c;我们可以直接使用vue create等命令&#xff0c;实际上能够这样使用的原因&#xff0c;就是使用了package.json里面的bin字段注册命令。接下来就以一个脚本文件为例子为大家演示一下bin是如何发挥作用的。 创建项目…

C语言例3-33:从键盘输入一个正整数保存至int 型变量 num,输出由8~11构成的数(从低位、0号开始编号)

算法分析&#xff1a; 使变量num右移8位&#xff0c;将原来的8~11位移到低4位上构造一个低4位为1&#xff0c;其余位为0的整数&#xff08;0000 0000 0000 1111&#xff09;与变量num进行按位与运算 代码如下&#xff1a; #include<stdio.h> int main(void) {int num,…

优惠:阿里云4核16G服务器优惠价格26.52元1个月、149.00元半年

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年&#xff0c;配置为阿里云服务器ECS经济型e实例ecs.e-c1m4.xlarge&#xff0c;4核16G、按固定带宽 10Mbs、100GB ESSD Entry系统盘&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接打开如下图&a…

蓝桥杯 2022 省B 砍竹子

思路&#xff1a; 非常明显&#xff0c;这题是个贪心。因为这题是求最小操作次数&#xff0c;而且每次操作都会变小&#xff0c;所以肯定要优先操作大的元素&#xff0c;这样它变小之后才可能和其它元素一起操作以减少操作次数。 所以&#xff1a;建立两个数组&#xff0c;一…

面试题小结

一、什么是虚拟dom 描述真实dom的js对象。 二、DOM操作——怎样添加、移除、移动、复制、创建和查找节点 &#xff08;1&#xff09;创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节…

FPGA - AXI4_Lite(实现用户端与axi4_lite之间的交互逻辑)

在之前的博客中对AXI4总线进行了介绍&#xff08;FPGA-AXI4接口协议概述&#xff09;&#xff0c;在这篇博客中&#xff0c;实现用户端与axi4_lite之间的交互逻辑。 一&#xff0c; AXI4 1.1 AXI4 介绍 对AXI4总线简单介绍&#xff08;具体可见FPGA-AXI4接口协议概述&#…

[linux][调度] 内核抢占入门 —— 线程调度次数与 CONFIG_PREEMPTION

在工作中&#xff0c;如果你正在做开发的工作&#xff0c;正在在写代码&#xff0c;这个时候测试同事在测试过程中测出了问题&#xff0c;需要你来定位解决&#xff0c;那么你就应该先暂停写代码的工作&#xff0c;转而来定位解决测试的问题&#xff1b;如果你正在定位测试的问…