news 2026/7/24 2:32:56

646. 最长数对链

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
646. 最长数对链

题目描述

给你一个由n nn个数对组成的数对数组p a i r s pairspairs,其中p a i r s [ i ] = [ l e f t , r i g h t ] pairs[i] = [left, right]pairs[i]=[left,right]l e f t < r i g h t left < rightleft<right

现在,我们定义一种 跟随 关系,当且仅当b < c b < cb<c时,数对p 2 = [ c , d ] p2 = [c, d]p2=[c,d]才可以跟在p 1 = [ a , b ] p1 = [a, b]p1=[a,b]后面。我们用这种形式来构造 数对链 。

找出并返回能够形成的 最长数对链的长度 。

你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。

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

示例 2
输入:pairs = [[1,2],[7,8],[4,5]]
输出:3
解释:最长的数对链是 [1,2] -> [4,5] -> [7,8] 。

算法原理

之前做子序列问题的时候,以i ii位置元素为结尾的子序列,i ii位置元素一般都是接在0 00~i − 1 i-1i1位置元素之后的,不会接在i + 1 i+1i+1~n − 1 n-1n1位置元素之后。但是在这道题目中,对于以i ii位置元素为结尾的数对链,i ii位置数对会接在0 00~i − 1 i-1i1位置数对之后,也会接在i + 1 i+1i+1~n − 1 n-1n1位置数对之后。比如示例2 22,以1 11位置数对为结尾的子序列,1 11位置数对可能会接在0 00位置数对和2 22位置数对之后。所以要进行预处理

预处理的方法很简单,直接按照数对的第一个元素进行升序排序即可。假设排完序后,第i ii个数对是[ a , b ] [a, b][a,b],第i + 1 i + 1i+1个数对是[ c , d ] [c, d][c,d]。如果[ a , b ] [a, b][a,b]要接在[ c , d ] [c, d][c,d]之后,一定要满足d < a d < ad<a。但是已经排序了,所以c > = a c >= ac>=a,数对内部是升序,得到d > c d > cd>c,所以d > c > = a d > c >= ad>c>=a,得到d > a d > ad>a,第i ii个数对肯定不会接在第i + 1 i+1i+1个数对之后


预处理完,使用动态规划解决问题,动态规划的思路和 最长递增子序列 类似

状态表示:一般根据经验+ ++题目要求得到。经验就是以某一个位置为结尾,题目要求是最长数对链的长度。所以d p [ i ] dp[i]dp[i]表示以i ii位置为结尾的所有数对链中,最长数对链的长度

状态转移方程:以i ii位置为结尾的数对链,可以分为长度= 1 = 1=1和长度> 1 > 1>1

  1. 长度= 1 = 1=1时,数对链只有一个数对,d p [ i ] = 1 dp[i] = 1dp[i]=1
  2. 长度> 1 > 1>1时,以i ii位置为结尾的数对链可以看成以i − 1 , i − 2 , . . . , 0 i-1, i-2, ..., 0i1,i2,...,0位置结尾的数对链+ ++i ii位置数对。假设0 < = j < = i − 1 0 <= j <= i-10<=j<=i1,以i − 1 , i − 2 , . . . , 0 i-1, i-2, ..., 0i1,i2,...,0位置结尾的数对链,它们分别最长的长度就是d p [ j ] dp[j]dp[j]i ii位置数对要想跟在这些数对链之后,肯定要满足p a i r [ j ] [ 1 ] < p a i r [ i ] [ 0 ] pair[j][1] < pair[i][0]pair[j][1]<pair[i][0],此时构成的新数对链的长度是d p [ j ] + 1 dp[j] + 1dp[j]+1。由于要最大值,所以d p [ i ] = m a x ( d p [ j ] + 1 , d p [ i ] ) dp[i] = max(dp[j] + 1, dp[i])dp[i]=max(dp[j]+1,dp[i])

初始化:以每一个位置为结尾的数对链,长度至少为1 11,所以初始化d p dpdp表为全1 11

填表顺序:从左到右

返回值d p dpdp表中元素的最大值

代码

classSolution{public:intfindLongestChain(vector<vector<int>>&pairs){sort(pairs.begin(),pairs.end(),[](vector<int>&v1,vector<int>&v2){returnv1[0]<v2[0];});intn=pairs.size();vector<int>dp(n,1);intret=dp[0];for(inti=1;i<n;++i){for(intj=i-1;j>=0;--j){if(pairs[i][0]>pairs[j][1])dp[i]=max(dp[j]+1,dp[i]);}ret=max(dp[i],ret);}returnret;}};
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 2:31:25

语音交互LLM:基于ASR+TTS的长对话技术实现与本地部署指南

这次我们来看一个很有意思的技术方向&#xff1a;用语音与LLM进行长对话来提升理解效率。这个想法来自知名AI研究者Karpathy&#xff0c;他提出通过语音交互可以大幅改善与大型语言模型的沟通体验。 语音交互最直接的优势是输入效率高——说话比打字快得多&#xff0c;尤其在进…

作者头像 李华
网站建设 2026/7/24 2:30:45

PCM3070音频编解码器时钟与接口配置实战指南

1. 项目概述&#xff1a;从芯片手册到可运行的音频系统如果你正在设计一个嵌入式音频系统&#xff0c;比如智能音箱、录音笔或者专业的音频接口&#xff0c;那么你大概率绕不开一颗关键的芯片&#xff1a;音频编解码器&#xff08;Codec&#xff09;。它的任务很简单&#xff0…

作者头像 李华
网站建设 2026/7/24 2:26:03

嵌入式C语言2026:RISC-V与物联网时代的编程实践

2026年&#xff0c;全球嵌入式市场规模突破3000亿美元&#xff0c;RISC-V架构的嵌入式芯片出货量超过50亿颗&#xff0c;物联网终端数量达到500亿台。C语言依然是嵌入式系统开发的绝对主力语言&#xff0c;占据了超过70%的嵌入式代码份额。本文将深入探讨2026年嵌入式C语言编程…

作者头像 李华
网站建设 2026/7/24 2:25:38

C语言网络编程2026:高性能服务器与协议栈开发实战

2026年&#xff0c;全球互联网流量达到每年5ZB&#xff08;泽字节&#xff09;&#xff0c;CDN边缘节点超过5000个&#xff0c;实时通信、视频流、物联网数据洪流推动了网络技术的持续演进。C语言仍然是高性能网络编程的首选语言&#xff0c;几乎所有的高性能网络服务器和中间件…

作者头像 李华
网站建设 2026/7/24 2:25:23

115、NPU的Tenstorrent:数据流架构的AI芯片

NPU的Tenstorrent:数据流架构的AI芯片 去年冬天调试一块基于Tenstorrent Grayskull的板子,遇到了一个让我抓狂的问题:模型推理结果每隔几次就会跳出一个NaN,但同样的模型在GPU上跑得好好的。查了三天,最后发现是数据流图中一个节点没有正确配置“张量广播”模式——Tenst…

作者头像 李华
网站建设 2026/7/24 2:25:14

凭什么跑个大模型,就非得要几千块的显卡、几十GB的显存?

项目地址&#xff1a;https://github.com/TencentYoutuResearch/Palm-Infra 一、为什么这个项目值得你停下来读&#xff1f; 如果你在本地部署过大模型&#xff0c;你一定被一个现实折磨过&#xff1a;模型太大&#xff0c;显存放不下。 70B的模型需要40GB显存&#xff0c;12…

作者头像 李华