牛客热题:矩阵最长递增路径

📟作者主页:慢热的陕西人

🌴专栏链接:力扣刷题日记

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

在这里插入图片描述

文章目录

  • 牛客热题:矩阵最长递增路径
    • 题目链接
    • 方法一:DFS
      • 思路
      • 代码
      • 复杂度
      • 时间复杂度:
      • 空间复杂度:
    • 方法二:优化--- 一个位置只递归一次
      • 思路
      • 代码
      • 复杂度
      • 时间复杂度:
      • 空间复杂度:

牛客热题:矩阵最长递增路径

题目链接

矩阵最长递增路径_牛客题霸_牛客网 (nowcoder.com)

方法一:DFS

思路

dfs:以(x, y)为起点进行递归:

​ 对于每个(x, y)来说,遍历它上下左右四个坐标,查看是否越界或者满足递增的要求;

​ 若是满足要求就继续递归满足要求的点

slove: 两重循环遍历矩阵中所有的点

代码

void dfs(vector<vector<int>>& matrix, vector<vector<int>>& st, int count, int x, int y, int& res)
    {
        array<int, 4> dx = {-1, 0, 1, 0};
        array<int, 4> dy = {0, 1, 0, -1};
        int n = st.size();
        int m = st[0].size();

        for(int i = 0; i < 4; ++i)
        {
            int X = x + dx[i], Y = y + dy[i];
            if(X < 0 || X >= n || Y < 0 || Y >= m)
            continue;

            if(st[X][Y] == 0 && matrix[X][Y] > matrix[x][y])
            {
                st[X][Y] = 1;
                dfs(matrix, st, count + 1, X, Y, res);
                st[X][Y] = 0;
            }
        }

        res = max(res, count);
    }
    
    int solve(vector<vector<int> >& matrix) 
    {   
        int n = matrix.size();
        int m = matrix[0].size();
        int res = 1;
        vector<vector<int>> st(n, vector<int>(m));
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < m; ++j)
                dfs(matrix, st, 1, i, j, res);

        return res;
    }

复杂度

时间复杂度:

​ dfs的时间复杂度为O(m * n), 主函数调用了m * n次,所以总体的时间复杂度是O( ( m ∗ n ) 2 (m * n) ^ 2 (mn)2)

空间复杂度:

创建了一个和原矩阵空间大小相同的矩阵用于判断当前的左边是否被递归过,以及一些变量。

​ 所以总体上来说空间复杂度:O(n * m);

方法二:优化— 一个位置只递归一次

思路

  1. 动态规划缓存: dp 矩阵用来缓存已经计算过的路径长度,避免重复计算。
  2. 减少递归调用: 通过在每个位置初始化时只调用一次 DFS,减少了不必要的递归调用。
  3. 简化函数参数: 去掉了 st 矩阵和 count 参数,将 dp 矩阵用作缓存,count 的功能由 dp[x][y] 代替。

代码

class Solution {
public:
    void dfs(const vector<vector<int>>& matrix, vector<vector<int>>& dp, int x, int y, int& res) {
        array<int, 4> dx = {-1, 0, 1, 0};
        array<int, 4> dy = {0, 1, 0, -1};
        int n = matrix.size();
        int m = matrix[0].size();

        for (int i = 0; i < 4; ++i) {
            int X = x + dx[i], Y = y + dy[i];
            if (X < 0 || X >= n || Y < 0 || Y >= m || matrix[X][Y] <= matrix[x][y]) {
                continue;
            }
            if (dp[X][Y] == 0) {
                dfs(matrix, dp, X, Y, res);
            }
            dp[x][y] = max(dp[x][y], 1 + dp[X][Y]);
        }

        res = max(res, dp[x][y]);
    }

    int solve(vector<vector<int>>& matrix) {
        int n = matrix.size();
        if (n == 0) return 0;
        int m = matrix[0].size();
        vector<vector<int>> dp(n, vector<int>(m, 0));
        int res = 1;

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (dp[i][j] == 0) {
                    dp[i][j] = 1;
                    dfs(matrix, dp, i, j, res);
                }
            }
        }

        return res;
    }
};

复杂度

时间复杂度:

​ 相当于遍历一遍对应的矩阵O(n * m)

空间复杂度:

创建了一个和原矩阵同等空间的dp数组,则空间复杂度为O(n * m)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vulhub中PHP利用GNU C Iconv将文件读取变成RCE(CVE-2024-2961)

GNU C 是一个标准的ISO C依赖库。在GNU C中&#xff0c;iconv()函数2.39及以前存在一处缓冲区溢出漏洞&#xff0c;这可能会导致应用程序崩溃或覆盖相邻变量。 如果一个PHP应用中存在任意文件读取漏洞&#xff0c;攻击者可以利用iconv()的这个CVE-2024-2961漏洞&#xff0c;将…

写一个盲盒模拟器

最近想写一个小程序&#xff0c;随便写一个玩吧&#xff0c;先想了下功能&#xff1a; 1.有很多盲盒&#xff0c;可以选择模拟开启 2.自定义盲盒&#xff0c;我们可以自定义制作盲盒自己玩 3.用户界面&#xff0c;记录盲盒历史&#xff0c;可以给坏越提意见 所用技术栈&…

Linux下互斥体的学习使用

文章目录 前言互斥锁的定义互斥锁的数据结构互斥锁的注意事项互斥锁API函数互斥锁的使用示例结语 前言 上篇我们讲过信号量&#xff0c;本篇讲下互斥体。本篇内核源码以内核5.10为例进行讲解 互斥锁的定义 其实信号量的值设置为1就可以使用信号量进行互斥访问了&#xff0c;…

中学生学人工智能系列:如何用AI学地理

经常有读者朋友给公众号《人工智能怎么学》留言咨询如何使用人工智能学习语文、数学、英语、化学等科目。这些都是中学教师、中学生朋友及其家长们普遍关注的问题。仅仅使用留言回复的方式&#xff0c;不可能对这些问题做出具体和透彻的解答&#xff0c;因此本公众号近期将推出…

Java—集合框架、时间和空间复杂度

一、集合框架 Java集合框架(Java Collection Framework)&#xff0c;又称为容器(container)&#xff0c;是定义在 java.util 包下的一组接口(interfaces)和其实现类(classes) 其主要表现为将多个元素(element)置于一个单元中&#xff0c;用于对这些元素进行快速、便捷的存储(…

纷享销客BI典型场景案例解析

本章以具体案例来说明纷享销客一体化BI智能分析平台为企业在实际使用过程中带来的价值。 1)场景一&#xff1a;销售经理想要在周会上关注各销售人员的客户及订单情况&#xff0c;并在每周一上午9点可以把上周的整体情况周期性的将报表推送给相关销售人员。 具体图表展示样式及…

人事管理系统有哪些优势?5大人事管理系统大盘点!

本人研究企业数字化转型10余年&#xff0c;为企业软件选型、数字化提供咨询服务&#xff01;目前重点研究低代码数字化转型玩法&#xff0c;力争为各家企业探索出一条更具性价比的数字化方式。 人事管理系统有哪些优势&#xff1f;如何选择&#xff1f;又该怎样部署&#xff1…

UI设计公司-蓝蓝设计-交通行业ui设计解决方案

来百度APP畅享高清图片 这是北京兰亭妙微科技有限公司&#xff08;简称蓝蓝设计&#xff09;在交通行业的一些ui设计经验&#xff0c;我们建立了UI设计分享群&#xff0c;每天会分享国内外的一些优秀设计&#xff0c;如果有兴趣的话&#xff0c;可以进入一起成长学习&#xff0…

springcloudalibaba项目注册nacos1.4.2,在nacos上修改配置项不生效问题

背景 之前的项目启动正常,后来发现springcloudalibaba的各版本匹配不正确,于是对项目中的springboot、springcloud、springcloudalibaba版本进行匹配升级,nacos1.4.2匹配的springboot、springcloud、springcloudalibaba版本与我的项目中的版本比较接近,于是我便重新安装了…

智能视频监控平台LntonCVS视频汇聚共享平台智慧楼宇应用方案

随着城市经济的迅速发展&#xff0c;大中型城市的写字楼数量不断增加。在像香港、台北、上海、北京等大城市&#xff0c;写字楼的安保成本相当高。为了降低这一成本&#xff0c;越来越多的物业公司开始采用技术手段。写字楼安防监控系统便是其中之一&#xff0c;它利用安全防范…

django 旅游服务系统-计算机毕业设计源码88939

摘 要 旅游服务系统采用采用django框架、python语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分&#xff0c;管理员管理主要功能包括&#xff1a;首页、轮播图&#xff08;轮播图管理&#xff09;、公告信息管理&#xff08;公告信息&#xff09;、资源管理&…

Informer

I n f o r m e r Informer Informer 摘要&#xff1a; 长序列时间序列的预测 i n f o r m e r informer informer优点&#xff1a; P r o b s p a r e Probspare Probspare自关注机制&#xff0c;在时间复杂度和内存使用方面达到 O ( N l o g N ) O(NlogN) O(NlogN),在序列依…

变量位置不同会死机?郭天祥老师视频的遗留问题分析答案

在郭天祥老师视频里有一个问题分享&#xff0c;是EXMC初始化里的一个变量定义和初始化位置不同会导致程序死机&#xff0c;最终定位到程序是进入hardfault死机&#xff0c;但暂时没有后续分析了&#xff0c;这里我们来继续分析一下。 死机的程序是这样的&#xff1a; 这段代码…

springboot集成uid-gengrator生成分布式id

一、简介 uid-generator是由百度技术部开发,GitHub地址 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器 Snowflake算法 Snowflake算法描述&#xff1a;指定机器 & 同一时刻 & 某一并发序列&#xff0c;是唯一的。据此可生成一个64 bits的唯一ID&#x…

SD6210A 低噪声可调电荷泵DC/DC转换器芯片IC

一般描述 该SD6210A是一种低噪声&#xff0c;恒定频率(1.20MHz)开关电容电压倍增器。它产生一个调节输出电压从2.8V到5V的输入与高达250mA的输出电流。低外部零件数(一个飞行电容器和两个小旁路电容的VIN和VOUT)使SD6210A非常适合小型&#xff0c;电池供电的应用新的电荷…

元宇宙数字藏品交易所,未来发展的大趋势

随着科技的飞速进步&#xff0c;元宇宙以其独特的魅力为数字世界绘制了一幅前所未有的宏伟蓝图。在这一宏大的背景下&#xff0c;数字藏品交易所作为连接虚拟与现实的桥梁&#xff0c;正以其卓越的优势&#xff0c;引领着数字藏品市场迈向新的高度。 首先&#xff0c;元宇宙为…

HBuilderX编写APP一、获取token

一、新建项目 二、从onenet获取key.js 1、下载之后的压缩包&#xff0c;解压2、关键就是找到key.js 3、将这个key.js复制到刚才的目录下面去 4、这个key.js文件就是生成token的代码 5、只要调用createCommonToken(params)这个函数&#xff0c;就可以实现生成token了 其中onload…

如何将OnePlus手机上的文件轻松传输到Mac(3种简便方法)

拥有一台OnePlus手机&#xff0c;意味着你拥有了一台性能强劲、功能丰富的Android设备。但当手机存储空间告急&#xff0c;或者你想要更好地管理和备份个人数据时&#xff0c;将文件传输到Mac电脑上无疑是一个明智的选择。本文将为你介绍三种简单有效的方法&#xff0c;帮助你轻…

十大排序-冒泡排序

算法原理如下&#xff1a; 给出一组数据&#xff1b;比较相邻的元素。如果第一个比第二个大&#xff0c;互换两个值。对每一组相邻元素同样方式比较&#xff0c;从开始的第一组到结束的最后一组。最后的元素会是最大数。除了排列好的最大数&#xff0c;针对所有元素重复以上步…

十、结果处理器

这一章和上一章参数处理器类似 首先是在XML解析的时候&#xff0c;顺便解析resultMap和resultType&#xff0c;一般更多的可能用的是resultType&#xff0c;为了实现统一&#xff0c;使用 resultType 的情况下&#xff0c;Mybatis也会创建一个resultMap实体类映射。 使用的时…