给你一个由
n
个数对组成的数对数组pairs
,其中pairs[i] = [lefti, righti]
且lefti < righti
。现在,我们定义一种 跟随 关系,当且仅当
b < c
时,数对p2 = [c, d]
才可以跟在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] 。提示:
n == pairs.length
1 <= n <= 1000
-1000 <= lefti < righti <= 1000
记录一个问题,当在类内使用sort函数,采用自己定义的比较函数时间,要将比较函数定义为静态成员函数,原理太复杂没看懂。
static bool cmp(vector<int> a, vector<int> b){
return a[1] < b[1];
}
int findLongestChain(vector<vector<int>>& pairs) {
int res = 0, last_end = INT_MIN;
sort(pairs.begin(), pairs.end(), cmp);
for(int i=0; i<pairs.size(); i++){
if(pairs[i][0] > last_end){
res++;
last_end = pairs[i][1];
}
}
return res;
}
200ms打败10%的人,但是大家都用贪心算法,代码也很相似,为什么时间相差这么多呢?参考了一下大佬的代码,改进排序,速度一下就提升了,打败90%。
int findLongestChain(vector<vector<int>>& pairs) {
int res = 0, last_end = INT_MIN;
sort(pairs.begin(), pairs.end(), [](const vector<int> &a, const vector<int> &b) {
return a[1] < b[1];
});
for(int i=0; i<pairs.size(); i++){
if(pairs[i][0] > last_end){
res++;
last_end = pairs[i][1];
}
}
return res;
}