每日刷题:435. 无重叠区间

232 阅读1分钟

435. 无重叠区间(难度:中等)

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意:

可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

解题思路

  1. 将区间的终点进行排序;
  2. 挑选出结尾大小最小的进行保留,因为这样余留给其他区间的空间越大;

题解

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));
}