力扣435-无重叠区间(Java详细题解)

题目链接: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;
    }
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值