1,贪心---先排序,按照数组中第一个元素排序,让每个位置存取对应最小的满足要求的元素,就能让这个链保证是最长的数对链
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs)
{
int cur=INT_MIN;
int res=0;
sort(pairs.begin(),pairs.end(),[](const vector<int>&a,const vector<int>&b){return a[1]<b[1];});
for(auto & e:pairs)
{
if(e[0]>cur)
{
cur=e[1];
res++;
}
}
return res;
}
};
2,数组排序+二分查找,用一个arr数组记录当下最优数链对,遇到一个新数对时,先查找可以存放的位置,再更新arr
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs)
{
vector<int>arr;
sort(pairs.begin(),pairs.end());
for(auto& e:pairs)
{
int x=e[0],y=e[1];
if(arr.empty()||x>arr.back())
{
arr.emplace_back(y);
}
else
{
int idx=lower_bound(arr.begin(),arr.end(),x)-arr.begin();
//二分查找找到合适位置
arr[idx]=min(arr[idx],y);
}
}
return arr.size();
}
};