《剑指 Offer》专项突破版 - 面试题 112 : 最长递增路径(C++ 实现)

news2024/11/18 10:42:25

题目链接:最长递增路径

题目

输入一个整数矩阵,请求最长递增路径的长度。矩阵中的路径沿着上、下、左、右 4 个方向前行。例如,下图中矩阵的最长递增路径的长度为 4,其中一条最长的递增路径为 3->4->5->8,如阴影部分所示。

分析

这又是一个以矩阵为背景的经典题目。仍然可以将矩阵中的数字看成图中的节点。由于这个问题是关于递增路径的,因此只关心从较小的数字指向较大的数字的边,两个不同数字在图中对应的节点之间的边是有向边,针对这个问题构建出来的图是一个有向图。同时,由于图中所有边都是从较小的数字指向较大的数字,这样的边不可能形成环,因此构建出来的图一定是有向无环图。例如,根据上图中的矩阵构建的有向无环图如下图所示。

接着考虑如何计算图中最长递增路径的长度。由于需要搜索图中的所有节点才能确定最长递增路径的长度,因此这也是一个关于图搜索的问题。解决图搜索通常用广度优先搜索和深度优先搜索这两种不同的方法。这个问题中的路径是非常关键的信息,而深度优先搜索能够很方便地记录搜索地路径,因此深度优先搜索更适合这个问题

因为不知道从哪个节点开始的递增路径是最长的,所以试着找出从矩阵的每个数字出发的最长递增路径的长度,通过比较可以得出整个矩阵中的最长递增路径的长度

代码实现

class Solution {
public:
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        int rows = matrix.size(), cols = matrix[0].size();
        vector<vector<int>> lengths(rows, vector<int>(cols, 0));
        int longest = 0;
        for (int i = 0; i < rows; ++i)
        {
            for (int j = 0; j < cols; ++j)
            {
                int length = dfs(matrix, lengths, i, j);
                longest = max(longest, length);
            }
        }
        return longest;
    }
private:
    int dfs(vector<vector<int>>& matrix, vector<vector<int>>& lengths, int i, int j) {
        if (lengths[i][j] != 0)
            return lengths[i][j];
        
        int rows = matrix.size(), cols = matrix[0].size();
        vector<vector<int>> dirs = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
        int length = 1;
        for (vector<int>& dir : dirs)
        {
            int r = i + dir[0];
            int c = j + dir[1];
            if (r >= 0 && r < rows && c >= 0 && c < cols && matrix[r][c] > matrix[i][j])
            {
                int path = dfs(matrix, lengths, r, c);
                length = max(length, path + 1);
            }
        }
        lengths[i][j] = length;
        return length;
    }
};

上述代码创建了一个与输入矩阵 matrix 大小相同的矩阵 lengths,lengths[i][j] 保存的是从矩阵中坐标为 (i, j) 的数字出发的最长递增路径的长度,然后通过比较得出矩阵中最长的递增路径的长度 longest

矩阵 lengths 的所有值都初始化为 0,而以矩阵中某个坐标为起点的最长递增路径的长度至少是 1,所以如果 lengths[i][j] 的值大于 0,就说明之前已经计算过以坐标 (i, j) 为起点的最长递增路径的长度,如果在计算以其他坐标为起点的最长递增路径的长度时需要用到以坐标 (i, j) 为起点的最长递增路径的长度,就没有必要再次计算,只需要直接返回就可以。即矩阵 lengths 起到了缓存的作用,能够确保以任意坐标为起点的最长递增路径的长度只需要计算一次

由于总是沿着数字递增的方向(maxtrix[r][c] > matrix[i][j] 为 true 时)在矩阵对应的图中搜索,这相当于是在一个有向无环图中搜索,因此不会出现重复访问一个节点的情况,也无须判断一个节点之前是否访问过

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

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

相关文章

护眼落地灯哪个牌子好?落地灯十大知名品牌

一款优异的落地灯不只有照明的作用&#xff0c;更有装修作用。只不过&#xff0c;市面上的落地灯产品很多&#xff0c;质量良莠不齐&#xff0c;很多人不知道怎么挑选是好。小编的主张是从品牌下手&#xff0c;挑选口碑上佳的品牌落地灯产品。若问护眼落地灯哪个牌子好&#xf…

Flask-SQLAlchemy 中使用显式主主数据库设置

1、问题背景 在一个 Flask-SQLAlchemy 项目中&#xff0c;用户想要使用显式主主数据库设置。具体而言&#xff0c;他想要能够从默认数据库中读取数据&#xff0c;并将数据持久化到两个主数据库中。他希望知道是否可以使用 Flask-SQLAlchemy 和 binds 来实现这一目标。 2、解决…

【MySQL篇】mysqlpump和mysqldump参数区别总汇(第三篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

Windows 的常用命令(不分大小写)

Net user &#xff08;查看当前系统所有的账户&#xff09; net user yourname password /add 添加新用户 net localgroup administrators yourname /add 添加管理员权限 net user yourname /delete 删除用户 net user 命令 [colorred]说明&#xff1a;以下命令仅限持管理员…

[创业之路-106] :经济学十大陷阱与核心思想:系统论、社会进化论、周期论、阴阳互转论

目录 前言&#xff1a; 一、流动性陷阱。 二、中等收入陷阱。 三、修昔底德陷阱。 四、塔西佗陷阱。 五、金德尔伯格陷阱。 六、卢梭陷阱。 七、拉美陷阱。 八、阿喀琉斯之踵。 九、布拉德伯里悖论。 十、李约瑟之谜 结论&#xff1a;上述陷阱的…

负载均衡集群——Nginx

目录 1.Nginx反向代理实战 2.Nginx 反向代理和负载均衡实践 实验操作步骤 步骤 1 Nginx1 和 Nginx2 配置 步骤2 测试资源是否可用 步骤 3 安装和配置 Nginx 代理 步骤 4 代理服务器配置检测 步骤 5 在 Nginx1 和 Nginx2 配置虚拟主机 步骤 6 将虚拟主机添加入后端主机组…

Linux--基础IO(上)

目录 1. 文件的边角知识 1.1 文件是什么&#xff1f; 1.2 文件是怎么打开的&#xff1f; 1.3 进程与文件 进程与文件的关系 2. 重温c语言文件接口 2.1 打开文件的方式 2.2 读写文件接口的重温 2.2.1 写文件 2.2.2 读文件 3. 系统文件I/O 3.1 系统接口 3.2 系…

零信任网络安全技术雷达图3.0正式发布

伴随零信任理念的发展和实施&#xff0c;零信任技术体系的演进变革也日趋完善。易安联力图通过持续更新并优化零信任雷达图&#xff0c;以反映零信任技术在应对新型网络安全挑战中的创新和发展&#xff0c;为企业和组织提供前瞻性的技术建议&#xff0c;助力其构建更为强大和灵…

前端JS必用工具【js-tool-big-box】,日期时间相关工具二

上一节我们说到了工具中关于日期的详细转换&#xff0c;还有获取年月日时分秒的详细转换方法使用&#xff0c;同时可以灵活添加自己需要的单位&#xff0c;很便捷。这一节我们继续学习几个相关的方法 目录 1 安装和引入 2 某个时间距离现在的显示 3 获取某一年是是平年还是…

dataguard环境破坏后采用rman备份集重新部署

dataguard环境破坏后采用rman备份集重新部署 1. 环境 主库: 192.168.1.118 备库: 192.168.1.85 OS: Centos7 DB: 11.2.0.4 前提条件:dataguard之前已经搭建好,从库的spfile和密码文件不需要创建,主库的数据文件目录在从库必须存在&#xff0c;这里的场景是主库…

请编写一个函数void fun(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入xx所指的数组中。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法和详细的解析。 题干 请编写一个函…

TVbox三端助手MAC+Windows+手机版带接口

Vbox这个目前大热的电视播放器&#xff0c;由于是空壳&#xff0c;于是接口成为非常核心的一环&#xff0c;很多网友制作的接口会进行加密&#xff0c;以防被人复制使用。 最近发现有人对此做了个专门解密的工具&#xff0c;解不解密的不重要的&#xff0c;分享迷倒是觉得这工…

树莓集团与企业协同育人,打造成都数字产业人才培养高地

树莓集团&#xff0c;作为成都数字产业的重要力量&#xff0c;深知企业协同育人的重要性。我们坚信&#xff0c;通过校企合作的模式&#xff0c;可以从供给侧结构性改革的角度出发&#xff0c;开展精准、高效的人才培养工作。我们既是企业&#xff0c;也是产业的代表&#xff0…

VUE识别图片文字OCR(tesseract.js)

效果:1&#xff1a; 效果图2&#xff1a; 一、安装tesseract.js npm i tesseract.js 二、静态页面实现 <template><div><div style"marginTop:100px"><input change"handleChage" type"file" id"image-input"…

uniapp使用腾讯地图实现商家定位

uniapp使用腾讯地图实现商家定位 一丶申请腾讯位置服务开发者密钥二丶下载微信小程序JavaScriptSDK三丶安全域名设置四、代码编写五、实现效果 一丶申请腾讯位置服务开发者密钥 官网教程&#xff1a;微信小程序JavaScript SDK | 腾讯位置服务 点击申请密钥 创建应用&#xf…

Hive 中常用的函数以及数据类型

数据类型 1.基本数据类型: 数据类型大小范围示例TINYINT1byte-128 ~ 127100YSMALLINT2byte-32768 ~ 32767100SINT4byte-2^32~ 2^32-1100BIGINT8byte-2^64~ 2^64-1100LFLOAT4byte单精度浮点数5.21DOUBLE8byte双精度浮点数5.21DECIMAL-高精度浮点数DECIMAL(9,8)BOOLEAN-布尔型tr…

Windows系统下安装paddle

开始使用_飞桨-源于产业实践的开源深度学习平台 (paddlepaddle.org.cn) 命令行下&#xff1a; python -m pip install --upgrade pip --user python -m pip install paddlepaddle2.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple 报异常 ERROR: Could not install packa…

力扣HOT100 - 24. 两两交换链表中的节点

解题思路&#xff1a; 递归 class Solution {public ListNode swapPairs(ListNode head) {if (head null || head.next null) {return head;}ListNode newHead head.next;head.next swapPairs(newHead.next);newHead.next head;return newHead;} }

nvm版本控制nvm list available报错

# 配置node镜像&#xff1a; node_mirror: https://npmmirror.com/mirrors/node/ # 配置npm镜像&#xff1a; npm_mirror: https://npmmirror.com/mirrors/npm/ 2024.4.22换域名了&#xff0c;改成这个才能用别的不行

护眼灯真的可以保护眼睛吗?揭秘护眼台灯五大骗局!

护眼台灯作为书房中必不可少的工具之一&#xff0c;基本家家户户都有&#xff0c;但是&#xff0c;随着需求的增加&#xff0c;越来越多不专业的台灯品牌进入市场&#xff0c;这种品牌下的产品不仅质量差&#xff0c;而且使用久了还会出现近视加深、散光等风险&#xff0c;导致…