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

LeetCode646-最长数队链

最长数队链

给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。

现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。

给定一个数对集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。

示例:

输入:[[1,2], [2,3], [3,4]]
输出:2
解释:最长的数对链是 [1,2] -> [3,4]

贪心

解题思路
根据题意知要找最长的数队链,即找满足 一个数组中第一个数大于另一个数组中第二个数 条件的最多的数组个数。

那么要挑选最长数对链的第一个数对时,最优的选择是挑选第二个数字最小的,这样能给挑选后续的数对留下更多的空间。挑完第一个数对后,要挑第二个数对时,也是按照相同的思路,是在剩下的数对中,第一个数字满足题意的条件下,挑选第二个数字最小的。

解题步骤

  1. 将输入按照第二个数字排序
  2. 遍历pairs。判断pairs中数队第一个数字是否能满足大于前一个数对的第二个数字,若满足变量rs+1
class Solution {
    public int findLongestChain(int[][] pairs) {
        int curr = Integer.MIN_VALUE, rs = 0;
        Arrays.sort(pairs, (a, b) -> a[1] - b[1]);
        for (int[] p : pairs) {
            if (curr < p[0]) {
                curr = p[1];
                rs++;
            }
        }
        return rs;
    }
}

时间复杂度:O(nlogn),排序时间复杂度
空间复杂度:O(logn),排序空间复杂度

动态规划

解题思路

  1. 定义 dp[i] 为以pairs[i] 为结尾的最长数对链的长度
  2. 计算 dp[i] 时,可以先找出所有的满足pairs[i][0]>pairs[j][1] 的 j,并求出最大的dp[j],dp[i] 的值即可赋为这个最大值加一。
  3. 注意:这种动态规划的思路要求计算dp[i] 时,所有潜在的 dp[j] 已经计算完成,可以先将 pairs 进行排序来满足这一要求。
class Solution {
    public int findLongestChain(int[][] pairs) {
        int n = pairs.length;
        Arrays.sort(pairs, (a, b) -> a[0] - b[0]);
        int[] dp = new int[n];
        Arrays.fill(dp, 1);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (pairs[i][0] > pairs[j][1]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }
        return dp[n - 1];
    }
}

时间复杂度:O(n^2)
空间复杂度:O(n)

相关文章:

  • 力扣:23,-合并K个升序链表
  • 移动Web第三天 1 移动端特点 2 百分比布局 3 Flex布局
  • vue中用ref实现父子组件、孙组件、兄弟组件、非亲子孙组件互相调用的方法
  • 【信号去噪】基于鲸鱼算法优化VMD实现信号去噪附matlab代码
  • git开发分支管理
  • 啊哈,一道有趣的Go并发题
  • [编程题]数据库连接池 - 牛客网题解
  • 线性回归模型(OLS)3
  • 如何利用腾讯云轻量应用服务器五分钟搭建一个WordPress博客?
  • 从外到内理解c++引用
  • [极客大挑战 2019]BabySQL
  • vue3+vite+windicss+element-plus+axios+router+cookies 搭建
  • ElasticSearch docker 方式安装
  • Spring——IOC 操作 Bean 管理(FactoryBean,作用域以及bean生命周期)
  • java毕业设计成品源码网站基于javaWeb停车场车辆管理系统的设计与实现|车位
  • es6(二):字符串的扩展
  • javascript面向对象之创建对象
  • mysql中InnoDB引擎中页的概念
  • PaddlePaddle-GitHub的正确打开姿势
  • TypeScript迭代器
  • 动态规划入门(以爬楼梯为例)
  • 前端面试总结(at, md)
  • 使用API自动生成工具优化前端工作流
  • 微服务入门【系列视频课程】
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #{} 和 ${}区别
  • #14vue3生成表单并跳转到外部地址的方式
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (2022 CVPR) Unbiased Teacher v2
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (差分)胡桃爱原石
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (算法)Travel Information Center
  • (一)kafka实战——kafka源码编译启动
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .axf 转化 .bin文件 的方法
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • /usr/bin/env: node: No such file or directory
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ 数据结构 - C++] AVL树原理及实现
  • []error LNK2001: unresolved external symbol _m
  • [1204 寻找子串位置] 解题报告
  • [AAuto]给百宝箱增加娱乐功能
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [Avalon] Avalon中的Conditional Formatting.
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [Django开源学习 1]django-vue-admin
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件