我的思路:举个例子:[[1, 2], [2, 3], [3, 4], [4, 5]]
建立一个数组res,res[i]表示0~i个pair最长的链。那么如果res[i]和res[j]满足要求,那么就有一个链是res[j] + 1,遍历所有的满足要求的res[j]+1,最长的res[j] + 1就是res[i]。
但这样会有一个问题,比如[3, 4], [2, 3], [1,2]这样就找不到链,因为第一个对是最大的,后面没有比3大的了,所以要先排序,sort(pairs.begin(), pairs.end())默认按照第一个数排序。
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
int pairnum = pairs.size();
vector<int> res(pairnum, 0);
if(pairnum < 2)
return 0;
sort(pairs.begin(), pairs.end());
for(int i = 1; i < pairnum; ++i)
{
int max = 0;
for(int j = i - 1; j >= 0; j--)
{
if(pairs[i][0] > pairs[j][1])
{
res[i] = res[j] + 1;
if(res[i] > max)
max = res[i];
}
}
res[i] = max;
}
return res[pairnum - 1] + 1; //加1是因为,要求返回链的长度,找到的第一对满足要求的链,链长是2不是1
}
};
补充一个二维vector的比较:
sort(pairs.begin(), pairs.end(), cmp);
static bool cmp(vector<int>& a, vector<int>&b) { return a[1] < b[1] || a[1] == b[1] && a[0] < b[0]; }