题目链接:435. 无重叠区间 - 力扣(LeetCode)
前情提要:
因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。
贪心方法:局部最优推出全局最优。
如果一个题你觉得可以用局部最优推出全局最优,并且没有反例来反驳的话就可以用贪心来试试。
其实这题你如果做过力扣452-用最少数量的箭引爆气球或者看过我的这那篇题解的话,那么就会感觉这题跟那题很像。
题解在这:力扣452-用最少数量的箭引爆气球(Java详细题解)-CSDN博客
题目思路:
其实这道题与我上面说的那道题很像,甚至只要对那道题的代码稍加改造,就能AC了。
可能朋友们回想,要移除区间,那我是不是真的要把这块区间从集合中移除。
其实不用,这样代码更复杂,而且时间复杂度也会更差。
本题要求移除的最小数量。
其实就是求重叠的数量,记录重叠的数量并累加,就能得出移除区间的最小数量。
因为你重叠的都删了,剩下的就都是不重叠的。
那怎么寻找重叠的区域呢?
重叠区域的方式有很多种,我们可以先处理不重叠的部分。
只要当前区间的左边界大于等于上一个区间右边界,那么这俩区间肯定不重叠。
那么不重叠的区域考虑完后,我们是不是就要考虑重叠的区域。
其实在代码里很好考虑重叠的部分,只要if else就好啦。
if判断不重叠,那么else的就是重叠的部分了。
我们判断当前区间与上一个区间重叠时,我们还应该判断与下一个区间是否重叠。
如何判断是否与下一个重叠呢?
其实我们只要将本层的右边界与上一个的右边界取最小值。
这样遍历到下一层时,他与上一层的右边界进行比较,就能知道本层能不能与上俩层一起重叠。
如果重叠就将重叠数量加一。
举个例子。
注意这里的气球你可以理解为区间。
最终代码:
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
//这个题可以说跟上一道非常像。
//上一道是要加不重叠的数量,这一道是要加重叠的数量。
//该题就是要求重叠区间的数量
int result = 0;
Arrays.sort(intervals,(a,b) -> {
return a[0] - b[0];
});
for(int i = 1;i < intervals.length;i ++){
//当出现没重叠时,就不管,开始遍历下一个区间。
if(intervals[i][0] >= intervals[i - 1][1]){
continue;
//出现重叠式,就将移除数量加1
}else{
result ++;
//当本区件与上一个区间出现重叠区间时,怎么判断与下一个区间是否重叠
//直接将本层与上一层取一个最小值,因为上俩层已经重叠了,我们要判断与下一层是否重叠,就要找上俩层右边界的最小值,只有右边界最小值还小与等于下一层边界,那么本层与上俩层就不重叠,否则就会重叠。
//本层我们只取最小值,循环到下一层时就会与上俩层的做对比啦
intervals[i][1] = Math.min(intervals[i][1],intervals[i - 1][1]);
}
}
return result;
}
}
这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。
我很乐意为你解答。那么我们下篇再见!