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

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; // 返回当前位置的最长递增路径长度
    }
};

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

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

相关文章

8 历史服务器配置

为了查看程序的历史运行情况&#xff0c;需要配置一下历史服务器 1、配置mapred-site.xml vim mapred-site.xml在该文件里面增加如下配置 //原先的配置不用删除 <!-- 历史服务器端地址 --> <property><name>mapreduce.jobhistory.address</name><…

微信私域管理系统:聊天记录监管,敏感词提示

随着公司规模的不断扩大&#xff0c;管理和监控变得更加重要。如果不进行有效的监督和管理&#xff0c;可能会产生以下风险&#xff1a;员工离职后将客户资源带到其他公司&#xff0c;给公司造成损失&#xff1b;员工删除相关客户资料&#xff0c;导致公司无法在微信上添加客户…

Adobe家里的“3D“建模工 | Dimension

今天&#xff0c;我们来谈谈一款在Adobe系列中比肩C4D的高级3D软件的存在—— Dimension。 Adobe Dimension &#xff0c;其定位是一款与Photoshop以及Illustrator相搭配的3D绘图软件。 Adobe Dimensions与一般的3D绘图软件相较之下&#xff0c;在操作界面在功能上有点不大相同…

安卓调用onnx模型并计算

安卓平台可以通过调用onnx模型来进行计算&#xff0c;这为移动设备提供了更多的计算能力和应用场景。通过使用onnx模型&#xff0c;安卓设备可以进行复杂的计算任务&#xff0c;例如图像识别、语音识别等。这为移动应用的功能和性能提升提供了新的可能性。同时&#xff0c;开发…

STM32笔记—USART

课外知识插入&#xff1a;STM32单片机extern全局变量_stm32全局变量-CSDN博客 如果你把temple定义在A中&#xff0c;然后让A.h和B.h包含在includes.h中&#xff0c;然后把includes.h放在A.c和B.c中单个编译是没有问题的&#xff0c;但是链接的时候会出现问题&#xff0c; “S…

【【OpenCV实现图像:用OpenCV进行模板匹配】

文章目录 概要整体架构流程图像灰度化结论 概要 模板匹配是一种在图像处理领域广泛应用的技术&#xff0c;旨在寻找目标模板在源图像中的位置。该算法的核心思想是通过比较模板与源图像的局部区域&#xff0c;逐像素滑动&#xff0c;创建一个相似度图&#xff0c;反映了模板与…

AD9371 AGC

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

MHA:故障切换

MHA&#xff1a; masterhight availabulity&#xff1a;基于主库的高可用环境下&#xff1a;主从复制 故障切换 主从的架构。 MHA&#xff1a;最少要一主两从 mysql的单点故障问题&#xff0c;一旦主库崩溃&#xff0c;MHA可以在0-30秒内自动完成故障切换。 工作原理&#…

警方打击了大规模网络钓鱼提供商BulletProftLink

导语 最近&#xff0c;马来西亚皇家警察宣布成功打击了一个名为BulletProftLink的大规模网络钓鱼提供商。这个提供超过300个钓鱼模板的平台被查封&#xff0c;给全球网络安全带来了巨大的利好消息。本文将带您了解这个引人注目的行动背后的故事&#xff0c;并揭示BulletProftLi…

metinfo 6.0.0 任意文件读取漏洞复现

metinfo 6.0.0 任意文件读取漏洞复现 漏洞环境 环境为mrtinfo 6.0.0 漏洞存在的位置 通过代码审计发现在源代码的/app/system/include/module/old_thumb.class.php这个位置有着任意读取文件漏洞 漏洞点:http://127.0.0.1/metinfo_6.0.0//include/thumb.php 漏洞复现 访…

网工内推 | 网工校招,金融、软件行业,HCIE认证优先,最高15薪

01 长威信息科技 招聘岗位&#xff1a;网络工程师&#xff08;24届校招&#xff09; 职责描述&#xff1a; 1、负责网络类、安全类产品的安装部署、调试和运行维护&#xff0c;以及网络故障分析、定位和处理&#xff1b; 2、负责实施项目各类文档编制工作&#xff0c;包括技术…

R语言爬虫程序自动爬取图片并下载

R语言本身并不适合用来爬取数据&#xff0c;它更适合进行统计分析和数据可视化。而Python的requests&#xff0c;BeautifulSoup&#xff0c;Scrapy等库则更适合用来爬取网页数据。如果你想要在R中获取网页内容&#xff0c;你可以使用rvest包。 以下是一个简单的使用rvest包爬取…

软考架构师学习心得和资料分享

23年11月的软考架构师终于考完了&#xff0c;相信很多朋友都觉得这次考试的内容有点难&#xff0c;我是从9月份报名后才开始准备的&#xff0c;一边工作一边学习确实压力很大&#xff0c;感觉更难了。 报名后还在闲鱼上买了份学习资料&#xff0c;后来又在芝士架构群里找了一些…

【IDEA】IntelliJ IDEA的使用2.0——结合实际场景提升工具使用

前言 IDEA作为一款非常不错的Java开发编辑工具&#xff0c;需要不断学习如何更好地使用IEDA工具&#xff0c;打造成得心应手的斧头。 本篇博客是结合实际场景提升IDEA使用的博客&#xff0c;会陆续收集一些实际使用场景&#xff0c;结合这些场景阐述如何更好地使用IDEA工具。…

软件工程理论与实践 (吕云翔) 第四章 结构化分析课后习题及答案

第四章 结构化分析 知识点&#xff1a; ​ 结构化分析模型的核心为数据字典&#xff0c;它是描述软件使用和产生的所有数据对象。围绕着这个核心有3种不同的图&#xff1a;“数据流图”指出当数据在软件系统中移动时怎样被变换&#xff0c;并描绘变换数据流的功能和子功能&am…

欧拉回路和欧拉路径

目录 欧拉回路基础 欧拉回路的定义 欧拉回路的性质 判断图中是否存在欧拉回路的java代码实现 寻找欧拉回路的三个算法 Hierholzer算法 详细思路 代码实现 欧拉路径 欧拉路径的定义 欧拉路径的性质 欧拉回路基础 欧拉回路的定义 欧拉回路遍历了所有的边&#xff0c;…

C语言从文件 D://test.txt 读取字符串,将字符串中所有的大写字符改为小写字母并写回到源文件中

完整代码&#xff1a; /*从文件 D://test.txt 读取字符串&#xff0c;将字符串中所有的大写字母改为小写字母并写回 到源文件中*/ #include<stdio.h>//将字符串中所有的大写字母改为小写字母 void func(char *buff){while (*buff!\0){if (*buff>A&&*buff<…

Netty Review - 核心组件扫盲

文章目录 PreNetty Reactor 的工作架构图CodePOMServerClient Netty 重要组件taskQueue任务队列scheduleTaskQueue延时任务队列Future异步机制Bootstrap与ServerBootStrapgroup()channel()option()与childOption()ChannelPipelinebind()优雅地关闭EventLoopGroupChannleChannel…

微信昵称后面的“小耳朵”是干什么用的?

微信&#xff0c;一款我们日常使用频繁的社交软件&#xff0c;它的功能远不止于聊天、刷朋友圈、支付和刷视频。其实&#xff0c;微信的许多不常用功能可以解决我们的实际问题。 聊天时&#xff0c;我发现朋友微信昵称后面多了一个神秘的小耳朵图标&#xff0c;引发了我的好奇心…

基于 Redis 实现的分布式锁

获取锁 互斥&#xff1a;确保只有一个线程获得锁 # 添加锁 利用setnx的互斥性 127.0.0.1:6379> setnx lock thread1释放锁 手动释放锁 超时释放&#xff1a;获取锁时设置一个超时时间 #释放锁 删除即可 127.0.0.1:6379> del lock两步合成一步 help setSET key value …