Leetcode646. 最长数对链

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.rhkb.cn/news/125911.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直播APP源码搭建:核心的服务器系统

在现代科技的推动下&#xff0c;网络衍生出了各种各样的技术&#xff0c;每个技术都被应用到需要的APP上&#xff0c;直播APP源码搭建出来的APP就是其中的一个&#xff0c;然而&#xff0c;这些技术能够成功的在直播APP源码搭建的APP中稳定的为用户们提供功能与服务&#xff0c…

手写Spring:第12章-基于JDK、Cglib实现AOP切面

文章目录 一、目标&#xff1a;基于JDK、Cglib实现AOP切面二、设计&#xff1a;基于JDK、Cglib实现AOP切面三、实现&#xff1a;基于JDK、Cglib实现AOP切面3.0 引入依赖3.1 工程结构3.2 AOP切点表达式和使用以及基于JDK和CGLIB的动态代理类图3.3 切点表达式3.3.1 类匹配接口3.3…

Scala

Scala 介绍 Scala是一种多规范的编程语言&#xff0c;它结合了面向对象编程&#xff08;OOP&#xff09;和函数式编程&#xff08;FP&#xff09;的特征&#xff0c;Scala的名字源于”Scalable language“&#xff0c;意为”可伸缩语言“。2003年开发的&#xff0c;并在JVM&a…

LeetCode 48题: 旋转图像

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]]…

激光切割机在船舶行业的的应用有哪些

我国享有世界工厂的美誉&#xff0c;是全球制造业的主力。然而&#xff0c;在船舶制造的关键技术领域&#xff0c;我国的研发投入不足&#xff0c;技术进步仍滞后&#xff0c;我国高端船舶制造的实力仍显不足。 在我国制造业全面复苏的当前背景下&#xff0c;“精准制作”正构成…

数据库 设计规范数据库设计样例

目录 5 数据库5.1 数据库命名规范5.2 数据库字段命名5.2.1 字段命名规范5.2.2 命名规范5.2.3 待优化命名示例5.2.4 字段类型规范5.2.5数据库中每个字段的规范描述 5.3表设计5.4 参考设计5.4.1 应用场景5.4.2 需求分析5.4.3 设计思路5.4.4 表结构设计5.4.5 缓存策略Q1 冗余设计和…

上手Spring

设置Maven镜像为阿里云 找到Maven的目录所在位置找到conf目录找到settings.xml文件 找到Maven的目录所在位置&#xff1a;去idea 的设置中 直接搜索Maven 找到conf目录 修改Maven本地仓库的地址 地址自定义 修改Maven的镜像为阿里云镜像 <mirror><id>nexus-aliy…

9.8day59

503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 知识点&#xff1a;单调栈 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09;

opencv基础: 视频,摄像头读取与保存的常用方法

当然还可以从视频中抓取截图&#xff0c;所以现在聊一下常用的抓取视频截图的的方法。 VideoCapture 方法 cv2.VideoCapture();cv2.VideoCapture( device);cv2.VideoCapture(filename);上面有三种构造方法&#xff0c; 第一种是无法构造方法。 第二种参数device是一个数字。 …

【群智能算法改进】一种改进的鹈鹕优化算法 IPOA算法[2]【Matlab代码#58】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始POA算法2. 改进后的IPOA算法2.1 随机对立学习种群初始化2.2 动态权重系数2.3 透镜成像折射方向学习 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始POA算法…

企业架构LNMP学习笔记24

学习目标和内容&#xff1a; 1、能够描述高可用HA的作用 2、能够理解VIP的切换&#xff1a;虚拟IP。 3、能够描述keepalived作用&#xff1a;保持活跃。主备的服务器的关系。 4、能够理解主master和备backup服务器关系 5、能够实现主备服务器高可用配置&#xff1a;主服务…

Java——》线程间是如何通信的

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

鸿蒙系列-如何使用DevEco分析app的性能

如何使用DevEco分析app的性能 性能优化、启动优化、内存优化、FPS监测、性能分析&#x1f9d0; 在鸿蒙OpenHarmony开发过程中&#xff0c;开发者开发的代码&#xff08;Stage 模型&#xff09;通常以调用 ArkUI 框架的代码为主&#xff0c;主要优化的代码部分也在其中&#x…

信息安全保障

文章目录 目录 文章目录 一.信息安全的定义 信息安全的概念 狭义的信息安全概念&#xff1a; 广义的信息安全问题&#xff1a; 信息系统安全问题的根源&#xff1a; 威胁情报 威胁情报的作用&#xff1a; 信息安全的特征 二.信息系统的属性 三.信息安全的视角 国家视角下的信…

LlamaIndex:将个人数据添加到LLM

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 LlamaIndex是基于大型语言模型&#xff08;LLM&#xff09;的应用程序的数据框架。像 GPT-4 这样的 LLM 是在大量公共数据集上预先训练的&#xff0c;允许开箱即用的令人难以置信的自然语言处理能力。但是&#xff0c;…

HTML的段落中怎么样显示出标签要使用的尖括号<>?

很简单&#xff1a; 符号 < 用 < 替代&#xff1b; 符号 > 用 > 替代。 示例代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>HTML中怎样打出尖括号</title> </head> <b…

AP3266 大功率同步降压恒流芯片 双路并用大电流LED车灯驱动线路 过EMC

产品描述 AP3266 是高效率、外围简单、内置功率管的同步降压恒流芯片&#xff0c;适用于4-40V输入的降压LED恒流驱动芯片。输出最大功率可达 40W&#xff0c;最大电流3.6A。AP3266 可通过调节 OVP 端口的分压电阻&#xff0c;设定输出空载电压 保护&#xff0c;避免高压 空载上…

【数据库事务日志碎片原理分析与方案】-深入解析篇.pdf

日志增长与 VLF 文件的个数 通过上面的相关内容的介绍&#xff0c;我们已经知道了日志文件自动的增长会到了一些问 题&#xff0c;而事实确实如此&#xff0c;下面&#xff0c;我们就来更加清楚的看看这些问题。 很显然&#xff0c;我们不希望日志文件任意的增长&#xff0c;…

外汇交易技巧分享:利用MT4交易平台进行精准的外汇技术分析

在外汇交易市场中&#xff0c;技术分析是一种重要的决策工具&#xff0c;能够帮助交易者预测价格走势和制定交易策略。而MT4交易平台作为一种功能强大、广泛应用的交易软件&#xff0c;为交易者提供了丰富的技术分析工具和功能。本文将与大家分享几个利用MT4交易平台(可在mtw.s…

Revit SDK 介绍:CreateAirHandler 创建户式风管机

前言 这个例子介绍如何通过 API 创建一个户式风管机族的内容&#xff0c;包含几何和接头。 内容 效果 核心逻辑 必须打开机械设备的族模板创建几何实体来表示风管机创建风机的接头 创建几何实体来表示风管机 例子中创建了多个拉伸&#xff0c;下面仅截取一段代码&#xff…