1、题目描述
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
2、题目分析
思路:
1.计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数。
2.在每次选择中,区间的结尾最为重要,选择的区间结尾越小,留给后面的区间的空间越大,那么后面能够选择的区间个数也就越大。
3.按区间的结尾进行排序,每次选择结尾最小,并且和前一个区间不重叠的区间。
知识补充:
定义优先队列,修改默认升序的排序关键字 key,可以选择数组中的优先元素进行排序PriorityQueue<int[]> minHeap = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
a->a[1]的作用是比较的是[1,2],[2,3]的第二个元素的顺序
3、代码实现
// 知识补充:
// 定义优先队列,修改默认升序的排序关键字 key,可以选择数组中的优先元素进行排序
// PriorityQueue<int[]> minHeap = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
/**
思路:
1.计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数。
2.在每次选择中,区间的结尾最为重要,选择的区间结尾越小,留给后面的区间的空间越大,那么后面能够选择的区间个数也就越大。
3.按区间的结尾进行排序,每次选择结尾最小,并且和前一个区间不重叠的区间。
*/
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
if(intervals.length == 0){
return 0;
}
// 对数组中的第二个元素进行排序
/**
[
[1,2]
[2,3]
[3,4]
[4,5]
]
*/
Arrays.sort(intervals,new Comparator<int[]>(){
public int compare(int[] o1,int[]o2){
// o[1] < o2[1],返回-1,o1[1] == o2[1],返回0,o[1] > o[2] ,返回1
return (o1[1] < o2[1]?-1:(o1[1] == o2[1]?0:1));
}
});
// 定义不重叠的个数,前面已经判断数组长度是否为0
int cnt = 1;
// 初始化结尾元素
int end = intervals[0][1];
for(int i = 1;i < intervals.length;i++){
// 判断结尾元素
// [1,2] < [3,4]
if(intervals[i][0] < end){
continue;
}
end = intervals[i][1];
cnt++;
}
return intervals.length - cnt;
}
}