1. 题目
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2]
和 [2,3]
的边界相互“接触”,但没有相互重叠。
2. 解题思路
问题本质:最少移除多少个区间,使得剩下的区间不重叠。
如果我们能找出最多有多少个互不重叠的区间,那么:
- 总区间数 n
- 不重叠的最大区间数 k
- 就可以得出:需要移除的区间数 = n - k
按区间的结尾进行排序,每次选择结尾最小,并且和前一个区间不重叠的区间
3. 代码
import java.util.Arrays;
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
int n = intervals.length;
return n - helpIntervals(intervals);
}
//有多少个不重叠的区间
private int helpIntervals(int[][] intervals) {
if (intervals.length <= 0) {
return 0;
}
Arrays.sort(intervals, (a, b) -> {
//asc
return a[1] - b[1];
});
//最少有一个区间是不重叠的
int count = 1;
int xEnd = intervals[0][1];
for (int[] interval : intervals) {
int start = interval[0];
if (start >= xEnd) {
count++;
xEnd = interval[1];
}
}
return count;
}
}