435.无重叠区间
题目
给定一个区间的集合 intervals
,其中 intervals[i] = [starti, endi]
。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
示例 1:
输入: intervals = [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:
代码
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
//根据左边界升序
Arrays.sort(intervals,(o1,o2) -> Integer.compare(o1[0],o2[0]));
int count = 0; //初始重叠区间个数
for(int i=1; i < intervals.length; i++){
//如果i左区间<i-1右区间,说明重叠了
if(intervals[i][0] < intervals[i-1][1]){
count++;
//更新i的右区间为i-1和i右区间更小的,用于下一次i+1是否重叠判断
intervals[i][1] = Math.min(intervals[i-1][1], intervals[i][1]);
}
}
return count;
}
}
总结
找移除区间的最小个数,就是找最少的重复区间,就当删除区间的覆盖范围尽量大一些。
如果i的左区间大于等于i-1的右区间,说明i-1和i不重叠,不用删。
如果i的左区间小于i-1的右区间,说明重叠i-1和i重叠了,重叠区间个数count+1,同时,为了下一步继续判断i+1和上面的区间是否重叠,需要更新i的右区间为i-1和i右区间的最小值。