题目:
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [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; };
总结:无重叠区间、用最少的箭射爆气球、最多可观看电影场数问题都是贪心区间问题,解题思路一样。先按照边界排序,再比较后一个区间的起点和前一个区间的终点的大小,即可判断出两个区间是否重叠。