标题:435无重叠区间-中等
题目
给定一个区间的集合 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
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
提示
- 1 <= intervals.length <= 105
- intervals[i].length == 2
- -5 * 104 <= starti < endi <= 5 * 104
代码Java
public int eraseOverlapIntervals(int[][] intervals) {
// Arrays.sort(intervals, new Comparator<int[]>() {
// @Override
// public int compare(int[] o1, int[] o2) {
// if (o1[0] == o2[0]) {
// return o1[1] - o2[1];
// }
// return o1[0] - o2[0];
// }
// });
int ans = 0;
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1]; // 保证右边界有序
}
});
int edge = Integer.MIN_VALUE;
for (int i = 0; i < intervals.length; i++) {
if (edge <= intervals[i][0]) {
edge = intervals[i][1];
} else {
ans++;
}
}
return ans;
}
public int eraseOverlapIntervals1(int[][] intervals) {
int ans = 0;
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) {
return o1[1] - o2[1];
}
return o1[0] - o2[0];
}
});
for (int i = 0; i < intervals.length; ) {
int j = i + 1;
while (j < intervals.length) {
if (intervals[j][0] < intervals[i][1] && intervals[j][1] <= intervals[i][1]) {
ans++;
break;
} else if (intervals[j][0] < intervals[i][1]){
ans++;
} else {
break;
}
j++;
}
i = j;
}
return ans;
}