Leetcode435
1.问题描述
2.解决方案
思路概述:
说句实话这道题实际上难得鸭皮我感觉,咱们只能说多回来看,遇到类似的题目多往这边想!
1.首先就是遇到这题那必然想到要排序了,那到底应该怎么排序呢
2.然后排完序就该贪心了
3.代码实现呢就对比那张图就好了,找到一个最小的end之后,再找一个下一个非交叉并且end最小,然后累积数量,然后用总数减去就好
难点分析:
1.这道题难点在于思路这个最多非交叉区间怎么出来的,怎么说呢就这种题,首先我们要往贪心的方向去想,那么既然是贪心那一定是一点一点确定最终结果的,也就是存在一个慢慢来一个一个确定的过程(用官方话就是局部最优确定全局最优)
2.那么既然慢慢来,又是一个区间不难想象是整个并区间的开始遍历到末尾,如果符合就加入的一个做题感觉,所以说这么说就是想转变思路不是一下子确定答案
3.然后有了这个思路,我们就准备确定第一个非交叉区间,这时候千万注意不去想后面的区间,只是对于这个区间应该具备什么特点才能达到整体最多个数,是不是很好想,那就是区间末尾要越小越好,越小后面就会有更多空间,就是要分析到这,后面就好说了,那后面的区间也是一个道理只要是不交叉,区间末尾越小越好然后计数,结果自然而然就出来了!
代码实现:
class Solution {
public:
static bool cmp(vector<int>& a,vector<int>& b){
return a[1]<b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
int end=intervals[0][1];
int count=1;
for(int i=1;i<intervals.size();i++){
if(end<=intervals[i][0]){
end=intervals[i][1];
count++;
}
}
return intervals.size()-count;
}
};