leetcode 435. Non-overlapping Intervals

本文介绍了一种高效算法,用于解决给定多个区间时,如何通过移除最少数量的区间来避免所有区间重叠的问题。文章详细解释了算法思路,包括如何通过排序和更新右端点来最小化移除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.

Note:

You may assume the interval’s end point is always bigger than its start point.
Intervals like [1,2] and [2,3] have borders “touching” but they don’t overlap each other.

Example 1:

Input: [ [1,2], [2,3], [3,4], [1,3] ]

Output: 1

Explanation: [1,3] can be removed and the rest of intervals are non-overlapping.

题目中给出了几个小区间,让去除最少数量的区间,使得剩下的区间没有overlap

overlap: 区间有重叠,哪怕是半个重叠也算 ex:[1,5], [4,7]

思路:
因为区间有左端点,右端点,判断的时候两者兼顾显然比较费时间,比如遇到如下情景
[1,3], [5, 7], [8,9], [2,5],遇到[2,5]的时候又要从前到后逐个查有没有overlap

可以看到之所以又要从头开始逐个 查是因为它的左端点在[5,7], [8,9]的前面,所以只需要让左端点按顺序出现就不需要逐个判断了

然后是右端点
比如刚开始出现了[1, 100], 后面依次是[1,2], [2, 3], [3, 4]
可以看到如果刚开始的区间定义在1~100的范围,那后面所有的小区间都要删除,就不满足题目中的删除最小数量的要求
所以每次都取较小的右端点,才能保证删除数量最小

而左端点因为是按升序排列的,小的左端点会在开始出现,后面不需要再更新左端点

如何判断overlap,只需要右端点 < 下一区间的左端点
题目中说Intervals like [1,2] and [2,3] have borders “touching” but they don’t overlap each other.,所以不需要用<=

    public int eraseOverlapIntervals(int[][] intervals) {
        if (intervals == null || intervals.length <= 1) {
            return 0;
        }
        
        Arrays.sort(intervals, new Comparator() {
           public int compare(Object o1, Object o2) {
               return ((int[])o1)[0] - ((int[])o2)[0];
           } 
        });
        
        int right = intervals[0][1];
        int res = 0;
        
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] < right) {
                res ++;
                right = Math.min(right, intervals[i][1]);
                continue;
            }
            
            if (intervals[i][1] > right) {
                right = intervals[i][1];
            }
            
        }
        
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值