Leetcode 题解 -- 贪心--不重叠的区间个数

 不重叠的区间个数

这个题问的是去掉几个才能满足不重叠区间的条件

还要设置一个start  满足后 start 就等于当前i

435. Non-overlapping Intervals (Medium)

Input: [ [1,2], [1,2], [1,2] ]

Output: 2

Explanation: You need to remove two [1,2] to make the rest of intervals non-overlapping.
Input: [ [1,2], [2,3] ]

Output: 0

Explanation: You don't need to remove any of the intervals since they're already non-overlapping.

题目描述:计算让一组区间不重叠所需要移除的区间个数。

 这里我们给intervals进行排序,排序的元素int[] 单个数组,按照区间的末位大小有小到大排序,

我们i从1开始取,如果该区间和前面区间比重复 就说明要删除这个区间 count+1

当不重复的话 那么i加1 但是此时要改变前去区间 前驱区间要变成i的这个区间 所以引入一个start变量

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if(intervals.length == 1 || intervals.length == 0)
            return 0;
        Arrays.sort(intervals, new Comparator<int[]>(){
            public int compare(int[] i1, int[] i2){
                return i1[1] - i2[1];
            }
        });
        int count = 0;
        int start = 0;
        for(int i = 1; i < intervals.length; i++){
            if(intervals[i][0] - intervals[start][1] >= 0){
                start = i;
                continue;
            }      
            count++;
        }
        return count;
    }
}

先计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数。

在每次选择中,区间的结尾最为重要,选择的区间结尾越小,留给后面的区间的空间越大,那么后面能够选择的区间个数也就越大。

按区间的结尾进行排序,每次选择结尾最小,并且和前一个区间不重叠的区间。

public int eraseOverlapIntervals(Interval[] intervals) {
    if (intervals.length == 0) {
        return 0;
    }
    Arrays.sort(intervals, Comparator.comparingInt(o -> o.end));
    int cnt = 1;
    int end = intervals[0].end;
    for (int i = 1; i < intervals.length; i++) {
        if (intervals[i].start < end) {
            continue;
        }
        end = intervals[i].end;
        cnt++;
    }
    return intervals.length - cnt;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值