当前位置: 首页> 健康> 科研 > 力扣题解( 最长数对链)

力扣题解( 最长数对链)

时间:2025/7/13 16:00:55来源:https://blog.csdn.net/yyssas/article/details/140379678 浏览次数:0次

646. 最长数对链

给你一个由 n 个数对组成的数对数组 pairs ,其中 pairs[i] = [lefti, righti] 且 lefti < righti 。

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

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

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

思路:

规定dp[i]是以i位置元素为最后一个元素的最大长度,此时dp[i]与dp[i-1]之间的关系无法确定,因为pair数组此时是无序的,以i位置元素为最后一个的最大长度可能包含下标大于i的元素,因此需要先对pairs数组重新排列,保证以i位置为最后一个元素时,所有可能包含的元素全在(0-i-1)中。为保证这个特性,规定一个比较函数,然后对pairs重新排雷,比较的方法可以是比较pair所有的right元素,或者比较left元素,然后按照从小到大排列。之所以按照left,right都行的原因是,若按照left排,则(0-i-1)的所有的right元素有小于或大于i位置处left元素,而(i+1-n)位置元素的right位置元素一定大于i位置left元素。而以right比较时,(i+1,n)位置的元素的right大于i位置left,故以left或right作比较元素均可以满足要求。

class Solution {
public:static bool cmp(const vector<int>&p1,const vector<int>&p2) {return p2[0]>p1[0];}int findLongestChain(vector<vector<int>>& pairs) {int n=pairs.size();sort(pairs.begin(),pairs.end(),cmp);vector<int>dp(n,1);vector<int>maxx(n);maxx[0]=pairs[0][1];dp[0]=1;for(int i=1;i<n;i++){  int a=pairs[i][0];int b=pairs[i][1];for(int j=0;j<i;j++){if(a>maxx[j]){//有构成新的最长的可能if(dp[i]<dp[j]+1){dp[i]=dp[j]+1;}}maxx[i]=b;}}int ret=dp[0];for(auto e:dp){ret=max(ret,e);}return ret;}
};

关键字:力扣题解( 最长数对链)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: