题目连接及描述
435. 无重叠区间 - 力扣(LeetCode)
56. 合并区间 - 力扣(LeetCode)
题目分析
二维数组,数组中每个元素为大小为2的一维数组,求移除区间的最小数量,使剩余区间互不重叠。今天写这道题目的时候联想到相同类型的,合并区间使得合并后的区间互不相交:56. 合并区间 - 力扣(LeetCode) 这两道题目本质思想非常类似,可以借助56题目的实现思路:先对二维数组中的所有元素进行排序,按照第一个元素升序进行排序,如果第一个元素相同,则按照第二个元素升序。唯一不同的点在于,遇到相邻节点需要合并时,最终返回结果必然加1操作。同时需要保证合并后的区间区小范围的。
本体测试用例不太能说明,取56题中的测试用例举例说明:
排序:
第56题对于区间合并的处理,此时合并后的区间范围将扩大,此时遇到【1,3】【2,6】重叠区间,将其处理为【1,6】。此题强调的是合并。
对于第435题,由于其要求的移除最小区间数量,使其不重叠,此时遇到【1,3】【2,6】应当尽量减少右边界增长的范围,此时取【1,3】也即移除【2,6】。
不能证明,每当遇到重叠区间时,局部减小右边界范围获得局部最优解,最终获得全局最优解。
参考如下图片:蓝色方框内容为遇到重叠区间后应当保留部分。
代码编写
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (it1, it2)->{
if(it1[0] == it2[0]){
return it1[1] - it2[1];
}else{
return it1[0] - it2[0];
}
});
int idx = 0, ans = 0;
for(int i = 1; i < intervals.length; i++){
if(intervals[i][0] >= intervals[idx][1]){
intervals[++idx] = intervals[i];
}else{
++ans;
if(intervals[i][1] <= intervals[idx][1]){
intervals[idx] = intervals[i];
}
}
}
return ans;
}
}