n 个数对,在每一个数对中,第一个数字总是比第二个数字小。
b < c 时,数对 (c, d) 才可以跟在 (a, b) 后面,用这种形式来构造一个数对链。dp 数组,其中 dp[i] 代表以数对 pairs[i] 为结尾的最长数对链长度。pairs[i] 下搜索所有索引小于 i 的数对 pairs[j],判断 paris[i][0] 是否大于 paris[j][1],如果大于,则说明区间不重叠,此时 dp[i] = max(dp[i], dp[j] + 1)。[start, end],就先将 pairs 数组按照 end 来排序。class Solution
{
public:
int findLongestChain(vector<vector<int>>& pairs)
{
int m = pairs.size();
vector<int> ans(m, 1);
sort(pairs.begin(), pairs.end());
for(int i = 1; i < m; ++i)
for(int j = i-1; j >= 0; --j)
{
if(pairs[i][0] > pairs[j][1])
ans[i] = max(ans[i], ans[j]+1);
}
return ans[m-1];
}
};
class Solution
{
public:
int findLongestChain(vector<vector<int>>& pairs)
{
sort(pairs.begin(), pairs.end(), [&](const vector<int>& a, const vector<int>& b)
{
return a[1] < b[1];
});
int cnt = 1, pre = pairs[0][1];
for(int i = 1; i < pairs.size(); ++i)
{
if(pairs[i][0] > pre)
{
++cnt;
pre = pairs[i][1];
}
}
return cnt;
}
};