贪心
1. 先对数组按照区间右边界进行排序,我们要保证删除更少的区间就等于我们要保留更多的区间,如何保留更多呢?那我们只需要在保留第i个区间时第i个区间的右边界尽可能的小即可,右边界越小可跟随在后面的区间就越多。
2.在排序之后我们只需要判断需要保留的右边界以及下一个需要保留的左边界即可
代码如下(如果在排序的lambda表达式的形参不加引用会超时):
class Solution {
public:
// 移除的区间最小,只需要将范围最小的留下,插入其中的删除即可
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
// 先对数组按照第一个元素进行排序
sort(intervals.begin(),intervals.end(),[](vector<int> &v1,vector<int> &v2)->int{
if(v1[1]<v2[1]){
return true;
}else if(v1[1] == v2[1]){
return v1[0]<v2[0];
}else{
return false;
}
});
int start = intervals.front()[1];
int count = 1;
for(auto e:intervals){
if(e[0]>=start){
start = e[1];
count++;
}
}
return intervals.size()-count;
}
};