当前位置: 首页 > news >正文

LeetCode 0329. 矩阵中的最长递增路径

【LetMeFly】329.矩阵中的最长递增路径:从大到小处理的动态规划

力扣题目链接:https://leetcode.cn/problems/longest-increasing-path-in-a-matrix/

给定一个 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”(因为没有比它更大的了)

处理完最大的数,我们就可以处理“第二大”的数了。第二大的数周如果有第一大的数,那么从这个第二大的数开始出发,“最长递增路径”为“2”

接着我们可以处理第三大的数、第四大的数、……

总之,只需要将原始地图中的元素按从大到小的顺序排个序(注意排序过程中,元素在地图中的原始位置信息不要丢失),就能从大到小开始遍历。遍历到一个数时,看这个数的四周有没有比它大的数,如果有,从这个数出发的“最长递增路径”就可以是“从它旁边比它大的数出发的最长路径 + 1”

整个过程中,不断更新“从某个点出发的最长递增路径”的最大值 即为答案。

  • 时间复杂度 O ( m n ) O(m n) O(mn)
  • 空间复杂度 O ( m n × log ⁡ ( m n ) ) O(m n\times \log (m n)) O(mn×log(mn))

AC代码

C++

struct MyNode {
    int x, y;
    int val;
};

bool cmp(const MyNode& a, const MyNode& b) {
    return a.val > b.val;
}

const int directions[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

class Solution {
public:
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        int n = matrix.size(), m = matrix[0].size();
        vector<MyNode> nodes;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                nodes.push_back({i, j, matrix[i][j]});
            }
        }
        sort(nodes.begin(), nodes.end(), cmp);
        vector<vector<int>> dp(n, vector<int>(m, 1));
        int ans = 1;
        for (MyNode thisNode : nodes) {
            int x = thisNode.x, y = thisNode.y;
            int val = thisNode.val;
            for (int d = 0; d < 4; d++) {
                int tx = x + directions[d][0];
                int ty = y + directions[d][1];
                if (tx >= 0 && tx < n && ty >= 0 && ty < m) {
                    if (matrix[tx][ty] > val) {
                        dp[x][y] = max(dp[x][y], dp[tx][ty] + 1);
                    }
                }
            }
            ans = max(ans, dp[x][y]);
        }
        return ans;
    }
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127043063

相关文章:

  • JavaEE:线程安全问题的原因和解决方案
  • Linux/CentOS 安装 flutter 与 jenkins 构建 (踩坑)
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • 随想录一期 day4 [24. 两两交换链表中的节点|19. 删除链表的倒数第 N 个结点|面试题 02.07. 链表相交|142. 环形链表 II]
  • iOS动画相关
  • LeetCode往完全二叉树添加节点
  • Linux、docker、kubernetes、MySql、Shell运维快餐
  • 基数(桶)排序算法详解之C语言版
  • 生成模型的中Attention Mask说明
  • java毕业设计企业固定资产管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  • Java---Java Web---JSP
  • opencv 机器学习-人脸识别
  • JavaScript的函数
  • java基于springboot+vue基本微信小程序的乒乓球课程管理系统 uniapp小程序
  • 安装数据库中间件——Mycat
  • [译]CSS 居中(Center)方法大合集
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • css系列之关于字体的事
  • HTTP中的ETag在移动客户端的应用
  • js面向对象
  • Median of Two Sorted Arrays
  • Python爬虫--- 1.3 BS4库的解析器
  • Yii源码解读-服务定位器(Service Locator)
  • 从setTimeout-setInterval看JS线程
  • 高度不固定时垂直居中
  • 利用DataURL技术在网页上显示图片
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 写给高年级小学生看的《Bash 指南》
  • 一起参Ember.js讨论、问答社区。
  • 与 ConTeXt MkIV 官方文档的接驳
  • nb
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #QT(串口助手-界面)
  • (12)Hive调优——count distinct去重优化
  • (Git) gitignore基础使用
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (四)模仿学习-完成后台管理页面查询
  • (一)appium-desktop定位元素原理
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)树状数组
  • .bat文件调用java类的main方法
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .Net Memory Profiler的使用举例
  • .NET 反射的使用
  • .Net 应用中使用dot trace进行性能诊断
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net操作Excel出错解决
  • .Net的C#语言取月份数值对应的MonthName值
  • ?
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证