一、题目描述
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
示例 1:
输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:
输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例 3:
输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/non-overlapping-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/b77eb25d86b316cd1bd0c369850d97c8.png)
三、解题思路
这里用的是贪心策略,刚好学习完贪心思想,树上有一道非常类似的题:活动选择。
大致思想就是:先将每个区间按结束时间(第二列)从小到大排列,首先选择第一个区间,然后将与其重叠的区间都移除掉,统计在该区间结束后开始的第一个区间(第一个不和前面的区间重叠的区间),重复进行选择,就可以得到最大不相交子集,总区间的个数减去最大不想交子集中区间的个数就是题目所求的个数。
四、AC代码
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
//取出最大不相交子集中区间的个数,总区间个数减去该数就是所求
int n = intervals.length;
Arrays.sort(intervals, new Comparator<int[]>(){ //按第二列(结束时间)对数组排序
public int compare(int[] o1, int[] o2){
if(o1[1] == o2[1])
return o1[0]-o2[0];
return o1[1] - o2[1];
}
});
int count = 1, endTime = intervals[0][1];
for(int i=1; i<n; i++){
if(intervals[i][0] >= endTime) { //开始时间在前面的结束时间之后
endTime = intervals[i][1];
count++;
}
}
return n-count;
}
}