Leetcode刷题详解——矩阵中的最长递增路径

news2024/11/26 13:43:31

1. 题目链接:329. 矩阵中的最长递增路径

2. 题目描述:

给定一个 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

算法(记忆化搜索):

算法思路:

  1. 递归含义:给dfs一个使命,给他一个下标[i,j],返回从这个位置开始的最长递增路径的长度

  2. 函数体:上下左右四个方向看一看,哪里能过去就过去,统计四个方向上的最大长度

  3. 递归出口:因为我们是先判断再进入递归,因此没有出口

  4. 用一个备忘录

  5. 每次进入递归的时候,去备忘录里面看看

  6. 每次返回的时候,将结果加入到备忘录里面

算法流程:

  1. 初始化变量mn,分别表示矩阵的行数和列数。
  2. 定义两个数组dx和dy,分别表示四个方向的横坐标变化和纵坐标变化。
  3. 定义一个二维数组memo,用于存储已经计算过的最长递增路径长度。
  4. 遍历矩阵的每一行和每一列,对于每个位置(i, j),调用dfs函数来计算从该位置开始的最长递增路径长度。
  5. dfs函数的作用是从当前位置(i, j)开始,向四个方向进行搜索,找到下一个值大于当前值的位置,然后递归地计算从该位置开始的最长递增路径长度。
  6. 如果已经计算过某个位置的最长递增路径长度,则直接返回该值,避免重复计算。
  7. dfs函数中,使用一个变量ret来记录当前位置的最长递增路径长度,初始值为1
  8. 遍历四个方向,对于每个方向,计算下一个位置的坐标(x, y),如果下一个位置在矩阵范围内且值大于当前位置的值,则递归地计算从该位置开始的最长递增路径长度,并更新ret的值。
  9. 将当前位置的最长递增路径长度存入memo数组,以便后续使用。
  10. 返回当前位置的最长递增路径长度。
  11. longestIncreasingPath函数中,遍历矩阵的每一行和每一列,对于每个位置(i, j),调用dfs函数来计算从该位置开始的最长递增路径长度,并更新ret的值。
  12. 最后,返回ret作为结果,即矩阵中的最长递增路径长度。

请添加图片描述

C++算法代码:

class Solution {
    int m, n; // 定义两个变量m和n,分别表示矩阵的行数和列数
    int dx[4] = {0, 0, 1, -1}; // 定义一个数组dx,表示四个方向的横坐标变化
    int dy[4] = {1, -1, 0, 0}; // 定义一个数组dy,表示四个方向的纵坐标变化
    int memo[201][201]; // 定义一个二维数组memo,用于存储已经计算过的最长递增路径长度

public:
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        int ret = 0; // 初始化最长递增路径长度为0
        m = matrix.size(), n = matrix[0].size(); // 获取矩阵的行数和列数
        for (int i = 0; i < m; i++) { // 遍历矩阵的每一行
            for (int j = 0; j < n; j++) { // 遍历矩阵的每一列
                ret = max(ret, dfs(matrix, i, j)); // 更新最长递增路径长度
            }
        }
        return ret; // 返回最长递增路径长度
    }

    int dfs(vector<vector<int>>& matrix, int i, int j) {
        if (memo[i][j] != 0) return memo[i][j]; // 如果已经计算过该位置的最长递增路径长度,则直接返回
        int ret = 1; // 初始化当前位置的最长递增路径长度为1
        for (int k = 0; k < 4; k++) { // 遍历四个方向
            int x = i + dx[k], y = j + dy[k]; // 计算下一个位置的坐标
            if (x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] > matrix[i][j]) {
                // 如果下一个位置在矩阵范围内且值大于当前位置的值,则递归计算下一个位置的最长递增路径长度
                ret = max(ret, dfs(matrix, x, y) + 1);
            }
        }
        memo[i][j] = ret; // 将当前位置的最长递增路径长度存入memo数组
        return ret; // 返回当前位置的最长递增路径长度
    }
};

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

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

相关文章

Lua的Resty-Request库写的一个简单爬虫

文章目录 准备工作编写爬虫运行爬虫代码分析拓展功能总结 &#x1f389;欢迎来到AIGC人工智能专栏~Lua的Resty-Request库写的一个简单爬虫 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;AIGC人工智…

德迅云安全告诉您关于CDN的一些事

在互联网时代&#xff0c;我们经常会见到cdn等相关设备&#xff0c;想要更好的满足我们工作和生活中的需求&#xff0c;我们就需要对这些知识有足够的了解。 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络&#…

【Proteus仿真】【STM32单片机】拔河游戏设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LED、动态数码管模块等。 主要功能&#xff1a; 系统运行后&#xff0c;指示灯处于中间位置&#xff0c;数码管显示得分0&#xff0c;当…

提前编译:AOT

JIT与AOT的区别 IT和AOT这个名词是指两种不同的编译方式&#xff0c;这两种编译方式的主要区别在于是否在“运行时”进行编译 (1)JIT&#xff0c;Just-in-time,动态(即时)编译&#xff0c;边运行边编译 在程序运行时&#xff0c;根据算法计算出热点代码&#xff0c;然后进行JI…

低代码平台是什么?具备哪些特性?

目录 一、低代码开发概念 二、低代码开发和零代码开发的区别 三、低代码和零代码的开发优势 四、低代码开发平台介绍 JNPF开发平台 1&#xff09;产品功能点 2&#xff09;产品功能模块 五、小结 低代码开发平台近两年发展迅猛&#xff0c;并迅速渗透到各个细分领域。本文简要介…

【SQLite】的使用及指令| 编程操作(增删改查)

一、SQLite 使用和指令集 SQLite 的基本使用SQL 命令 二、常见的 SQL 数据类型 三、SQLite的命令用法 四、SQLite的编程操作 五、sqlite3_open函数 六、sqlite3_close函数 七、sqlite3_errcode函数 八、SQLite C Interface 九、sqlite3_exec函数 十、callback回调函数 十一、…

005、Nvidia Jetson Nano Developer KIT(b01)-硬件配置

之——设备监视与控制 杂谈 要做个小项目&#xff0c;很多外设设置记录一下。 正文 1.jtop安装 之前写的里有&#xff0c;jtop监视器可以很方便地查看整个设备的运行状态&#xff1a;基本环境配置 它提供了有关计算机硬件使用情况的详细信息。在jtop的界面中&#xff0c;可以显…

如何利用IP代理进行海外推广?

在当今数字化的时代&#xff0c;网络营销已经成为企业策略的重要组成部分。而对于进去海外市场的跨境玩家来说&#xff0c;海外的推广推广是重中之重。然而&#xff0c;在开展推广的过程中&#xff0c;我们常常会遇到各种挑战&#xff0c;如地域限制、访问速度慢等。 为了解决…

如果不用Baklib,哪一个帮助中心工具能够替代它?

在各行各业进入“留量时代”的当下&#xff0c;让用户获得良好的体验和留存老客户变得更为关键&#xff0c;这对于企业的客户服务提出了更高的要求。在使用各类互联网产品时&#xff0c;用户更倾向于通过自助方式寻找答案并解决问题&#xff0c;因此帮助中心的重要性也在不断提…

Eclipse使用配置tomcat服务:未识别的web项目

问题1&#xff1a;未识别的项目 解决&#xff1a;elispse未识别到改项目为Web项目

【LeetCode刷题-双指针】--674.最长连续递增序列

674.最长连续递增序列 class Solution {public int findLengthOfLCIS(int[] nums) {int n nums.length,i 0,j 0,res 0;while(j < n){if( j>0 && nums[j-1] > nums[j]){i j;}j;res Math.max(res,j - i);}return res;} }

Eclipse使用配置tomcat服务:五个地方配置JDK

添加Server配置jdk [这里是tomcat运行的jdk为1.7] 不影响项目本身编译的jdk1.6及系统环境的jdk1.6 &#xff1a;tomcat运行的jdk 项目JDK配置&#xff1a; &#xff1a;开发JDK &#xff1a;编译JDK &#xff1a;eclipse使用jdk

基于谐波参数空间的卷积神经网络自动三维牙齿分割

论文连接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1524070320300151 机构&#xff1a; a英国卡迪夫大学计算机科学与信息学院 b中国科学院大学北京 c中国科学院计算技术研究所北京 d深圳大数据研究院&#xff0c;深圳518172 代码链接&#x…

高频CSS面试题

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 BFC 块级格式上下文(block format context)是页面一块独立的渲染区域&#xff0c;具有一套独立的渲染规则 内部的…

leetcode刷题日记:121. Best Time to Buy and Sell Stock( 买卖股票的最佳时机)

题目给了我们一组数prices&#xff0c;其中prices[i]表示第i天的股票价格&#xff0c;需要我们求出买卖股票所能获得的最大收益。 我们的第一想法就是从算出每一种买卖股票的情况然后求出里面的最大值&#xff0c;这样我们就能得到最大收益是多少&#xff0c;但是这种情况过于复…

[文件读取]coldfusion 文件读取 (CVE-2010-2861)

1.1漏洞描述 漏洞编号CVE-2010-2861漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: Adobe ColdFusion是美国Adobe公司的一款动态Web服务器产品&#xff0c;其运行的CFML&#xff08;ColdFusion Markup Language&#xff09;是针对Web应用的一种程序设计语言。 A…

VBA技术资料MF82:替换文件夹中文件名中的字符

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

基于51单片机电子钟温度计数码显示设计( proteus仿真+程序+设计报告+讲解视频)

这里写目录标题 ✅1.主要功能&#xff1a;✅讲解视频&#xff1a;✅2.仿真设计✅3. 程序代码✅4. 设计报告✅5. 设计资料内容清单&&下载链接✅[资料下载链接&#xff1a;](https://docs.qq.com/doc/DS0Nja3BaQmVtWUpZ) 基于51单片机电子钟温度检测数码显示设计( proteu…

企业为什么要做软文营销推广

数字化时代的来临使企业推广方式发生变化&#xff0c;软文营销推广成为企业推广的常用方式之一&#xff0c;今天媒介盒子就来和大家聊聊&#xff0c;为什么企业需要做软文营销推广。 一、 第三视角传播品牌&#xff0c;提升受众接受度 传统广告的叙事方式是企业站出来&#x…

μC/OS-II---Task管理2(os_task.c)

目录 改变Task优先级Task挂起Task恢复Task信息获取Task调度器上锁&#xff08;os_core.c&#xff09;Task调度器开锁&#xff08;os_core.c&#xff09; 改变Task优先级 #if OS_TASK_CHANGE_PRIO_EN > 0u INT8U OSTaskChangePrio (INT8U oldprio,INT8U newprio) { #if (…