给你一个由 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;
}
};