Leetcode646. 最长数对链

news2025/1/20 14:50:43

Every day a Leetcode

题目来源:646. 最长数对链

解法1:动态规划

定义 dp[i] 为以 pairs[i] 为结尾的最长数对链的长度。

初始化时,dp 数组需要全部赋值为 1。

计算 dp[i] 时,可以先找出所有的满足 pairs[i][0]>pairs[j][1] 的 j,并求出最大的 dp[j],dp[i] 的值即可赋为这个最大值加一。

状态转移方程:dp[i] = max(dp[i], dp[j] + 1)

这种动态规划的思路要求计算 dp[i] 时,所有潜在的 dp[j] 已经计算完成,可以先将 pairs 数组进行排序来满足这一要求。

代码:

/*
 * @lc app=leetcode.cn id=646 lang=cpp
 *
 * [646] 最长数对链
 */

// @lc code=start
class Solution
{
public:
    int findLongestChain(vector<vector<int>> &pairs)
    {
        // 特判
        if (pairs.empty())
            return 0;
        int n = pairs.size();
        // 状态数组,并初始化
        vector<int> dp(n + 1, 1);
        // dp[i]: 为 pairs[i] 结尾的最长数对链的长度
        sort(pairs.begin(), pairs.end());
        //  状态转移
        for (int i = 1; i <= n; i++)
            for (int j = 1; j < i; j++)
                if (pairs[j - 1][1] < pairs[i - 1][0])
                    dp[i] = max(dp[i], dp[j] + 1);
        return dp[n];
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n2),其中 n 为 pairs 数组的长度。排序的时间复杂度为 O(nlogn),两层 for 循环的时间复杂度为 O(n2)。

空间复杂度:O(n),dp 数组的空间复杂度为 O(n)。

解法2:最长递增子序列

方法一实际上是「300. 最长递增子序列」的动态规划解法,这个解法可以改造为贪心 + 二分查找的形式。

用一个数组 arr 来记录当前最优情况,arr[i] 就表示长度为 i+1 的数对链的末尾可以取得的最小值,遇到一个新数对时,先用二分查找得到这个数对可以放置的位置,再更新 arr。

代码:

/*
 * @lc app=leetcode.cn id=646 lang=cpp
 *
 * [646] 最长数对链
 */

// @lc code=start

// 动态规划

// class Solution
// {
// public:
//     int findLongestChain(vector<vector<int>> &pairs)
//     {
//         // 特判
//         if (pairs.empty())
//             return 0;
//         int n = pairs.size();
//         // 状态数组,并初始化
//         vector<int> dp(n + 1, 1);
//         // dp[i]: 为 pairs[i] 结尾的最长数对链的长度
//         sort(pairs.begin(), pairs.end());
//         //  状态转移
//         for (int i = 1; i <= n; i++)
//             for (int j = 1; j < i; j++)
//                 if (pairs[j - 1][1] < pairs[i - 1][0])
//                     dp[i] = max(dp[i], dp[j] + 1);
//         return dp[n];
//     }
// };

// 贪心 + 二分查找

class Solution
{
public:
    int findLongestChain(vector<vector<int>> &pairs)
    {
        sort(pairs.begin(), pairs.end());
        vector<int> dp;
        for (auto &pair : pairs)
        {
            int x = pair[0], y = pair[1];
            if (dp.empty() || dp.back() < x)
                dp.push_back(y);
            else
            {
                auto iter = lower_bound(dp.begin(), dp.end(), x);
                *iter = min(*iter, y);
            }
        }
        return dp.size();
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(nlog⁡n),其中 n 为 pairs 的长度。排序的时间复杂度为 O(nlogn),二分查找的时间复杂度为 O(nlogn),二分的次数为 O(n)。

空间复杂度:O(n),数组 arr 的长度最多为 O(n)。

解法3:贪心

要挑选最长数对链的第一个数对时,最优的选择是挑选第二个数字最小的,这样能给挑选后续的数对留下更多的空间。

挑完第一个数对后,要挑第二个数对时,也是按照相同的思路,是在剩下的数对中,第一个数字满足题意的条件下,挑选第二个数字最小的。

按照这样的思路,可以先将输入按照第二个数字排序,然后不停地判断第一个数字是否能满足大于前一个数对的第二个数字即可。

代码:

class Solution
{
private:
    // 排序函数
    static bool cmp(const vector<int> &a, const vector<int> &b)
    {
        return a[1] < b[1];
    }

public:
    int findLongestChain(vector<vector<int>> &pairs)
    {
        int cur = INT_MIN, res = 0;
        sort(pairs.begin(), pairs.end(), cmp);
        for (auto &pair : pairs)
        {
            int x = pair[0], y = pair[1];
            if (cur < x)
            {
                cur = y;
                res++;
            }
        }
        return res;
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(nlog⁡n),其中 n 为 pairs 的长度。排序的时间复杂度为 O(nlogn)。

空间复杂度:O(log⁡n),为排序的空间复杂度。

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

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

相关文章

Python学习 -- pickle模块和configparser模块

当在Python中需要进行数据的序列化和反序列化、以及配置文件的读写时&#xff0c;pickle 模块和 configparser 模块是两个非常有用的标准库。以下是关于这两个模块的详细使用方式&#xff0c;包括示例代码。 pickle 模块 pickle 模块用于序列化和反序列化Python对象&#xff…

verilog学习笔记7——PMOS和NMOS、TTL电路和CMOS电路

文章目录 前言一、PMOS和NMOS1、NMOS2、PMOS3、增强型和耗尽型4、两者面积大小 二、CMOS门电路1、非门2、与非门3、或非门4、线与逻辑5、CMOS传输门6、三态门 三、TTL电路四、TTL电路 VS CMOS电路五、数字电平六、使用CMOS电路实现逻辑函数1、上拉网络 PUN2、下拉网络 PDN3、实…

嵌入式新手应该怎么学?

嵌入式新手应该怎么学? 对于嵌入式新手来说&#xff0c;知道一点嵌入式&#xff0c;知道嵌入式大概是做什么的&#xff0c;不是很懂&#xff0c;所以要熟悉掌握嵌入式的概念。我们可以看到网上或者书上很多解释&#xff1a;嵌入式系统是针对某个应用&#xff0c;软硬件可裁减的…

Qemu支持ATF + u-boot + linux kernel

qemu环境搭建及ATF/u-boot/linux kernel的编译等&#xff0c;参考 从零开始搭建qemu调试环境 - 知乎 ATF编译: wmxwmx-VirtualBox:~/work/arm-trusted-firmware$ cat build-atf.sh export ARCHarm64 export CROSS_COMPILE/home/wmx/Downloads/gcc-linaro-7.4.1-2019.02-x86_…

无涯教程-JavaScript - IMCSCH函数

描述 IMCSCH函数以x yi或x yj文本格式返回复数的双曲余割。 复数的双曲余割定义为双曲正弦的倒数,即 csch(z) 1 /出生(z) 语法 IMCSCH (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the hyperbolic cosecant.Required Not…

Python基础教程:索引和切片

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 索引&#xff08;下标&#xff09; 索引又称下标&#xff0c;用来表示可迭代对象中的某个元素的位置。 用正整数表示的索引值&#xff0c;从左向右定位&#xff0c;从 0 开始计数&#xff0c;如 0&#xff0c;1&#…

HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(二)并行识别

并行识别组合手势对应的GestureMode为Parallel。并行识别组合手势中注册的手势将同时进行识别&#xff0c;直到所有手势识别结束。并行识别手势组合中的手势进行识别时互不影响。 以在一个Column组件上绑定点击手势和双击手势组成的并行识别手势为例&#xff0c;由于单击手势和…

韶音耳机是哪个国家的品牌,韶音耳机属于什么档次

在如今耳机产品层出不穷的时代&#xff0c;许多品牌纷纷推陈出新&#xff0c;打造出更具创新性的耳机产品。其中&#xff0c;韶音耳机可谓引人注目。然而&#xff0c;对于韶音耳机这个品牌&#xff0c;仍有许多朋友并不熟悉。比如说&#xff0c;韶音耳机是哪个国家的品牌呢&…

数字孪生和GIS的结合如何改变现代农业?

数字孪生技术和地理信息系统&#xff08;GIS&#xff09;是两个独立但高度互补的领域&#xff0c;它们的结合在农业领域具有巨大的潜力&#xff0c;可以带来巨大的改变。在这篇文章中&#xff0c;我们将讨论数字孪生技术和GIS系统如何协同作用&#xff0c;为农业带来创新和可持…

缓存淘汰算法-LRU

目录 前言 一、LRU 算法 二、LRU 算法图解 三、LRU 算法实现 四、LRU 算法分析 五、LRU 算法改进方案 前言 我们常用缓存来提升数据查询速度&#xff0c;由于缓存容量有限&#xff0c;当缓存容量到达上限&#xff0c;就需要删除部分数据挪出空间&#xff0c;这样新数据才…

IP175LLF基本参数和引脚图

特性 宽工作温度范围IP175LLF(0C至70C) IP175LLFI(-40C至85C)内置5个MAC和4个PHY 每个端口可配置为10base-t、100Base-TX 最多2K个MAC地址支持自极性10Mbps 汽车MDI-MDIX 支持1个MII/RMII端口Layer2-4多字段分类器 支持8-MultiField输入支持交通政策支持多字段过滤器 支…

【word技巧】如何在word文件中方框打对勾?

Word文件制作了调查问卷或者信息表之类的文件&#xff0c;总是少不了有需要打勾的选项&#xff0c;如果打印成了纸质文件打勾就简单了&#xff0c;但是在word文件中应该如何在方框中打√符号呢&#xff1f;今天分享三个方法。 方法一&#xff1a; 先输入一个大写的R&#xff…

MES生产管理系统的五个关键组件

MES管理系统在当今制造业中发挥着越来越重要的作用。它是一种先进的生产管理系统&#xff0c;旨在连接企业资源计划&#xff08;ERP&#xff09;系统和生产现场之间的信息桥梁。在本文中&#xff0c;我们将探讨在制造过程中实施MES管理系统时需要考虑的几个关键因素。 首先&…

【漏洞复现】金和OA C6任意文件读取漏洞

漏洞描述 金和OA协同办公管理系统C6软件共有20多个应用模块&#xff0c;160多个应用子模块&#xff0c;涉及的企业管理业务包括协同办公管理、人力资源管理、项目管理、客户关系管理、企业目标管理、费用管理等多个业务范围&#xff0c;从功能型的协同办公平台上升到管理型协同…

计算机脚本的概念,如何编写、使用脚本 (Script)?

一、脚本的概念和使用场景 在计算机领域的脚本&#xff0c;指的是使用一种特定的描述性语言&#xff0c;依据一定的格式编写的可执行文件脚本语言又被称为扩建的语言或者动态语言, 是一种编程语言, 用来控制软件应用程序, 脚本通常是以文本 (ASCⅡ) 保存, 只是在被调用时进行解…

AFL++模糊测试

一、AFL 这里我们主要使用AFL Fuzzing 测试IOT的二进制文件&#xff0c;当我们解压提取一个固件时&#xff0c;能够获得大量的IOT二进制应用 &#xff0c;如果要进行漏洞挖掘则需要将二进制文件进行逆向分析&#xff0c;然后查找危险函数以及输入接口&#xff0c;对于一个大型的…

管理类联考——数学——汇总篇——知识点突破——数据分析——计数原理——排列组合——成双

&#x1f30a; 配对问题的解题思路&#xff1a;配对问题主要以鞋子或者手套来作为命题对象&#xff0c;其核心在于成双不成双&#xff0c;对于成双问题&#xff0c;直接选取整双即可&#xff0c;对于不成双问题&#xff0c;要先取成双的&#xff0c;然后从每双中取单只即可。 …

计算机使用中常用截图与标注方法

一、截图常用方法 1&#xff0e;windows自带快捷键 Print Screen SysPq 截取全屏&#xff0c;可以粘到word文档中&#xff0c;可以粘贴到"画图"程序中&#xff0c;命名一个文件名&#xff0c;另存为图片&#xff0c;或.jpg后缀&#xff0c;或.png后缀 alt Print S…

掌动智能国产化测试工具的重要性与优势

在信息技术领域的快速发展下&#xff0c;对于软件和硬件产品的质量和性能要求也日益提高。同时针对信创要求&#xff0c;国产化测试工具在这个过程中发挥着重要的作用&#xff0c;不仅能够提升产品的可靠性和稳定性&#xff0c;还能够降低测试成本和提高测试效率。作为国内领先…

win10怎么禁止软件联网

有一些用户发现软件在联网的状态下会进行自动更新&#xff0c;想要禁止软件联网却不知道如何操作&#xff0c;这里小编就给大家详细介绍一下Win10禁止软件联网的方法&#xff0c;有需要的小伙伴快来和小编一起看一看了解一下吧。 Win10禁止软件联网的方法&#xff1a; 1、按下…