不重叠的区间个数
这个题问的是去掉几个才能满足不重叠区间的条件
还要设置一个start 满足后 start 就等于当前i
435. Non-overlapping Intervals (Medium)
Input: [ [1,2], [1,2], [1,2] ]
Output: 2
Explanation: You need to remove two [1,2] to make the rest of intervals non-overlapping.
Input: [ [1,2], [2,3] ]
Output: 0
Explanation: You don't need to remove any of the intervals since they're already non-overlapping.
题目描述:计算让一组区间不重叠所需要移除的区间个数。
这里我们给intervals进行排序,排序的元素int[] 单个数组,按照区间的末位大小有小到大排序,
我们i从1开始取,如果该区间和前面区间比重复 就说明要删除这个区间 count+1
当不重复的话 那么i加1 但是此时要改变前去区间 前驱区间要变成i的这个区间 所以引入一个start变量
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
if(intervals.length == 1 || intervals.length == 0)
return 0;
Arrays.sort(intervals, new Comparator<int[]>(){
public int compare(int[] i1, int[] i2){
return i1[1] - i2[1];
}
});
int count = 0;
int start = 0;
for(int i = 1; i < intervals.length; i++){
if(intervals[i][0] - intervals[start][1] >= 0){
start = i;
continue;
}
count++;
}
return count;
}
}
先计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数。
在每次选择中,区间的结尾最为重要,选择的区间结尾越小,留给后面的区间的空间越大,那么后面能够选择的区间个数也就越大。
按区间的结尾进行排序,每次选择结尾最小,并且和前一个区间不重叠的区间。
public int eraseOverlapIntervals(Interval[] intervals) {
if (intervals.length == 0) {
return 0;
}
Arrays.sort(intervals, Comparator.comparingInt(o -> o.end));
int cnt = 1;
int end = intervals[0].end;
for (int i = 1; i < intervals.length; i++) {
if (intervals[i].start < end) {
continue;
}
end = intervals[i].end;
cnt++;
}
return intervals.length - cnt;
}