无重叠区间

题目:

  给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

  注意:

    可以认为区间的终点总是大于它的起点。
    区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

题解:贪心区间问题。先按边界排序,再比较后一个区间的起点是否前一个区间的终点重叠。代码如下:

Java版本

   public int eraseOverlapIntervals(int[][] intervals) {
       if(intervals.length == 0) return 0;
        //按照右边界排序
        Arrays.sort(intervals,(a,b)-> { return a[1] -b[1];});      
        int end = intervals[0][1];
        int count = 0;
        for(int i=1;i<intervals.length;i++){
            if(intervals[i][0] < end) count++;//移除重叠的区间,end不变
            else end = intervals[i][1];
        }
        
        return count;
    }

JS版本

var eraseOverlapIntervals = function(intervals) {
    if(intervals.length == 0) return 0;

    //按照右边界排序
    intervals.sort(function(a,b){
        return a[1] - b[1];
    });
    
    let end = intervals[0][1];
    let count = 0;
    for(let i=1;i<intervals.length;i++){
        if(intervals[i][0] < end) count++;//移除重叠的区间,end不变
        else end = intervals[i][1];
    }
    
    return count;
        
};

总结:无重叠区间、用最少的箭射爆气球、最多可观看电影场数问题都是贪心区间问题,解题思路一样。先按照边界排序,再比较后一个区间的起点和前一个区间的终点的大小,即可判断出两个区间是否重叠。

原文地址:https://www.cnblogs.com/bobobjh/p/14415855.html