LeetCode 329. 矩阵中的最长递增路径(C++)*

news2024/11/15 4:32:33

思路:
1.用动态规划,但是时间复杂度太高,效率太低
2.使用常规的DFS,时间复杂度高,包含了太多重复无效遍历,会超时
3.在DFS的基础上使用记忆化搜索,帮助消去重复的遍历,提高效率
原题链接:https://leetcode.cn/problems/longest-increasing-path-in-a-matrix/description/

1.题目如下:

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。

示例 1:

在这里插入图片描述

输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4 

解释:最长递增路径为 [1, 2, 6, 9]。

示例 2:

在这里插入图片描述

输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]
输出:4 

解释:最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。

示例 3:

输入:matrix = [[1]]
输出:1

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 200
0 <= matrix[i][j] <= 231 - 1

2.代码如下:

class Solution {
    
public:
//思路一:动态规划  O(nm)
/*
    状态转移方程:
    dp[i][j]=max(dp[i'][j'] if matrix[i'][j'] > matrix[i][j]) + 1
    但是一个节点有四个移动方向,对于动态规划方程dp来说,找不到初始值供转移方程使用;
    可以将所有元素排序,从大到小遍历元素,并且使用转移方程,这样保证能够使用转移方程
    时间复杂度高  会超时
*/

//思路二:回溯法 BFS
/*
    如果只使用简单的BFS,则会超时,因为会有很多多余的重复的操作
*/
/*
    int maxLength=0;
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        vector<vector<int>> idx={{1,0},{-1,0},{0,1},{0,-1}};
        int n=matrix.size();
        int m=matrix[0].size();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                stack<int> sTemp;
                backTrack(matrix,sTemp,i,j,idx);
            }
        }
        return maxLength;
    }

    void backTrack(vector<vector<int>>& matrix,stack<int> sTemp,int i,int j,vector<vector<int>> &idx){
        sTemp.push(matrix[i][j]);
        maxLength=maxLength<sTemp.size()?sTemp.size():maxLength;
        for(int k=0;k<4;k++){
            int inew=i+idx[k][0];
            int jnew=j+idx[k][1];
            if(inew>=0 && jnew>=0 && inew<matrix.size() && jnew<matrix[0].size()){
                if(sTemp.top()<matrix[inew][jnew]){
                    backTrack(matrix,sTemp,inew,jnew,idx);
                }
            }
        }

    }
*/


//思路三: DFS和 记忆化搜索提高效率
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        vector<vector<int>> idx={{1,0},{-1,0},{0,1},{0,-1}};
        //用来标记每个结点开始的所能达到的最大长度
        vector<vector<int>> mark(matrix.size(),vector<int>(matrix[0].size(),0));
        int n=matrix.size();
        int m=matrix[0].size();
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                //对于每个结点。取最大长度
                ans=max(ans,dfs(matrix,i,j,idx,mark));
            }
        }
        return ans;
    }

    int dfs(vector<vector<int>>& matrix,int i,int j,vector<vector<int>> &idx,vector<vector<int>>& mark){
        //如果不等于0,证明有其他路径经过该结点,直接返回路径
        if(mark[i][j]!=0){
            return mark[i][j];
        }
        //如果等于0,则证明未经过该结点,从该结点DFS,mark[][]++
        mark[i][j]++;
        for(int k=0;k<4;k++){
            int inew=i+idx[k][0];
            int jnew=j+idx[k][1];
            //DFS 条件
            if(inew>=0 && jnew>=0 && inew<matrix.size() && jnew<matrix[0].size() && matrix[inew][jnew]>matrix[i][j]){
                //如果有能够深度遍历的更大结点,则判断取两者更大值
                //如果一个结点没有能够遍历的结点,则mark[][]等于1;
                mark[i][j]=max(mark[i][j],dfs(matrix,inew,jnew,idx,mark)+1);
            }
        }
        return mark[i][j];
    }
    
};

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

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

相关文章

解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常

目录 问题描述 报错信息 问题原因 如何解决 参考资料 问题描述 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的&#xff0c;因此&#xff0c;此网页稍后可能会恢复正常。 报错信息 今天使用Edge浏览器在访问一个平时常用的emoji网站时&#xff0c;…

springboot整合spring-security

在web开发中&#xff0c;安全性问题比较重要&#xff0c;一般会使用过滤器或者拦截器的方式对权限等进行验证过滤。此博客根据b站up主&#xff0c;使用demo示例进行展示spring-security的一些功能作用。 目 录 1、创建项目 2、编写controller 3、添加spring-security依赖 …

Spring Cloud OpenFeign 配置

最少的配置&#xff08;使用默认配置&#xff09; 最少/默认配置示例如下&#xff08;使用Nacos作为服务的注册与发现中心&#xff09;&#xff1a; application.properties server.port8082 spring.application.namenacos-consumer spring.cloud.nacos.discovery.server-ad…

[拆轮子] PaddleDetection中__shared__、__inject__ 和 from_config 三者分别做了什么

在上一篇中&#xff0c;PaddleDetection Register装饰器到底做了什么 https://blog.csdn.net/HaoZiHuang/article/details/128668393 已经介绍了 __shared__ 和 __inject__ 的作用: __inject__ 表示引入全局字典中已经封装好的模块。如loss等。__shared__为了实现一些参数的配…

excel函数技巧:函数TEXT七助数据大变身

如果函数有职业&#xff0c;那各函数的职业会是什么呢&#xff1f;别的先不说&#xff0c;就拿TEXT而言&#xff0c;它可以让日期变数字、数字变日期、阿拉伯数字变大写中文数字、金额元变万元&#xff0c;连IF的条件判断它也可以变出来…这简直就是当之无愧的变装女皇啊&#…

从0到1完成一个Node后端(express)项目(三、写接口、发起请求)

往期 从0到1完成一个Node后端&#xff08;express&#xff09;项目&#xff08;一、初始化项目、安装nodemon&#xff09; 从0到1完成一个Node后端&#xff08;express&#xff09;项目&#xff08;二、下载数据库、navicat、express连接数据库&#xff09; 写接口 我们看ex…

关于Linux部署Tomcat的访问问题

文章目录1.问题2.排除问题2.1检查Tomcat是否启动2.2检查防火墙&端口3.其他可能的问题3.1java的配置问题3.2可能出现了端口占用问题1.问题 在CentOS7系统的主机中配置好了Tomcat后发现通过默认端口无法访问到&#xff08;http://xx:xx:xx:xx:8080&#xff09; 2.排除问题 …

C语言在杨氏矩阵中找一个数

这道题大家都会做&#xff0c;使用暴力算法遍历整个数组。但是题目要求时间复杂度小于O&#xff08;n&#xff09;&#xff0c;这样做显然不合题意&#xff0c;所以&#xff0c;通过分析杨氏矩阵的特点&#xff0c;我们发现矩阵右上角的那个数为一行中最大的&#xff0c;一列中…

SAP MM 新建移动类型(Movement Type)

一、概念 物料的移动类型&#xff08;Movement Type&#xff09;代表了货物的移动&#xff0c;当一个物料做某种移动时&#xff0c;便开始了如下一系列事件&#xff1a; 1、一个物料凭证会被创建&#xff0c;可以被用来作为移动的证明及作为其它任何相关应用的一个信息来源&am…

Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测

Jetson nano 入手系列之6—使用qt creator 开发c opencvCSI摄像头人脸检测1.创建摄像头人脸检测项目1.1 创建并配置项目1.2 编辑文件1.2.1 main.cpp1.2.2 CMakeLists.txt2.构建及编译2.1 直接使用qt creator完成2.2 使用命令行参考文献本系列针对亚博科技jetson nano开发板。 …

一篇文章带你学会MySQL数据库的基本管理

目录 前言 一、数据库的介绍 二、mariadb的安装 三、数据库的开启及安全初始化 四、数据库的基本管理 五、数据库密码更改及破解 六、用户授权 七、数据库的备份 八、phpmyadmin的安装 总结 前言 什么是数据库&#xff1f; 每个人家里都会有衣柜&#xff0c;衣柜是…

前端效果积累 | 酷炫、实用3D地球路径飞行效果实现

&#x1f4cc;个人主页&#xff1a;个人主页 ​&#x1f9c0; 推荐专栏&#xff1a;前端开发成神之路 --【这是一个为想要入门和进阶前端开发专门开启的精品专栏&#xff01;从个人到商业的全套开发教程&#xff0c;实打实的干货分享&#xff0c;确定不来看看&#xff1f; &…

【C语言进阶】自定义类型之结构体

目录一&#xff1a;结构体1.1&#xff1a;结构的基础知识&#xff1a; 1.2&#xff1a;结构的声明&#xff1a; 1.3&#xff1a;特殊声明&#xff08;匿名结构体&#xff09;&#xff1a; 1.4&#xff1a;结构的自引用&#xff1a; 1.5&#xff1a;结构体变量的定义和初始化&am…

springboot 项目自定义log日志文件提示系统找不到指定的文件

自己尝试搭建了一个springboot项目&#xff0c;自定义了log日志文件&#xff0c;启动后报错 Logging system failed to initialize using configuration from logback-spring.xml java.io.FileNotFoundException: E:\code_demo\xxxx\logback-spring.xml (系统找不到指定的文件…

Elasticsearch(二)--Elasticsearch客户端讲解

一、前言 在上一章我们大致了解了下elasticsearch,虽说上次的内容全是八股文&#xff0c;但是很多东西还是非常有用的&#xff0c;这些哪怕往小说作为面试&#xff0c;往大说是可以帮你很快的理解es是个什么玩意儿&#xff0c;所以还是非常推荐大家去看一下上一章内容。 这一章…

【C++】map和set的使用

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;关联式容…

码二哥的技术专栏 总入口

已发表的技术专栏&#xff08;订阅即可观看所有专栏&#xff09; 0  grpc-go、protobuf、multus-cni 技术专栏 总入口 1  grpc-go 源码剖析与实战  文章目录 2  Protobuf介绍与实战 图文专栏  文章目录 3  multus-cni   文章目录(k8s多网络实现方案) 4  gr…

JVM整理笔记之测试工具JCStress的使用及其注解的应用

文章目录前言如何使用JCStress测试代码JCStress 注解说明前言 如果要研究高并发&#xff0c;一般会借助高并发工具来进行测试。JCStress&#xff08;Java Concurrency Stress&#xff09;它是OpenJDK中的一个高并发测试工具&#xff0c;它可以帮助我们研究在高并发场景下JVM&a…

RecyclerView 倒计时和正计时方案

本章内容一.方案制定二.设计三.编码相信不少同学都会在这里栽跟头&#xff0c;在思考这个问题设计了两套方案&#xff0c;而我的项目需求中需要根据业务是否反馈来进行倒计时和正计时的操作。一.方案制定 1.在Adapter中使用CountDownTimer 2.修改数据源更新数据 3.只修改页面展…

leetcode--各种数据结构相关的题

数据结构1.数组&#xff08;1&#xff09;找到所有数组中消失的数字(448)&#xff08;2&#xff09;旋转图像(48)&#xff08;3&#xff09;搜索二维矩阵 II(240)&#xff08;4&#xff09;最多能完成排序的块(769)2.栈和队列&#xff08;1&#xff09;用栈实现队列(232)&#…