435. 无重叠区间(难度:中等)
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
解题思路
- 将区间的终点进行排序;
- 挑选出结尾大小最小的进行保留,因为这样余留给其他区间的空间越大;
题解
public int eraseOverlapIntervals(int[][] intervals) {
if (intervals.length == 0) {
return 0;
}
Arrays.sort(intervals, Comparator.comparingInt(o -> o[1]));
int min = 0;
int prev = intervals[0][1];
for (int index = 1, size = intervals.length; index < size; index++) {
if (intervals[index][0] < prev) {
++min;
} else {
prev = intervals[index][1];
}
}
return min;
}
测试
NonOverlappingIntervals nonOverlappingIntervals = new NonOverlappingIntervals();
@Test
public void text_case1() {
int[][] intervals = {
{1, 2},
{2, 3},
{3, 4},
{1, 3}
};
Assertions.assertEquals(1, nonOverlappingIntervals.eraseOverlapIntervals(intervals));
}
@Test
public void test_case2() {
int[][] intervals = {
{1, 2},
{1, 2},
{1, 2}
};
Assertions.assertEquals(2, nonOverlappingIntervals.eraseOverlapIntervals(intervals));
}
@Test
public void test_case3() {
int[][] intervals = {
{1, 2},
{2, 3}
};
Assertions.assertEquals(0, nonOverlappingIntervals.eraseOverlapIntervals(intervals));
}