题目描述
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
求解思路
本题应该使用贪心算法,也就是当出现区间重叠的情况下,使用贪心的思路,选取右区间更加靠前的一个,可以保证和剩余的区间重叠的概率最低,这样考虑下来不重叠的部分就最大
因此第一步是对区间进行排序,排序规则使用一维数组的右边界进行排序,从左向右的方式遍历
- 第一组和遍历过程中的元组没有交集的情况下,统计不重叠区间的最大值
- 使用全部元组的数量减去不重叠区间元组的数量, 就可以得到最小需要移除的元组了
解决代码
public int eraseOverlapIntervals(int[][] intervals) {
//定义排序比较器
if (intervals == null) {
return 0;
}
//统计不重叠的区间个数
int notOverlapNum = 1;
Arrays.sort(intervals, Comparator.comparingInt(o -> o[1]));
int rightEdge = intervals[0][1];
for(int k= 1; k< intervals.length; k++) {
if (intervals[k][0] >= rightEdge) {
rightEdge = intervals[k][1];
notOverlapNum++;
}
}
return intervals.length - notOverlapNum;
}
题目总结
- 本题需要注意解决多维二元组的重叠或者不重叠问题时,首先通过自定义比较器实现排序,之后根据排序的数组进行统计和判断
- 第二点在于贪心算法的运用,本题就是一个合适的场景:当出现区间重叠的时候,一定会减少我们结果集的个数,但是向潜在损失小的方向考虑,就能最优的实现留存最大的结果。我们本题不考虑具体删除的区间,只统计删除的个数,因此使用贪心算法能满足要求