Description
Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.
Note:
- You may assume the interval’s end point is always bigger than its start point.
- Intervals like [1,2] and [2,3] have borders “touching” but they don’t overlap each other.
Example 1:
1 | Input: [ [1,2], [2,3], [3,4], [1,3] ] |
Example 2:
1 | Input: [ [1,2], [1,2], [1,2] ] |
Example 3:
1 | Input: [ [1,2], [2,3] ] |
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
分析
首先以第一个元素的为基准对各个区间排序
初始化冲突计数器为 0,设置两个指针,一前一后,每个指针指向一个区间
如果两个指针指向的区间有冲突,则前指针指向最小覆盖的区间,后指针向后移动一个区间,冲突计数器加一
如果两指针指向的区间没有冲突,则两指针平滑向后移动一个区间
返回冲突计数器中的值。
程序设计
储备知识
Java 比较器
区间的排序是依据第一个元素进行比较操作的。Java 有两种方式提供比较功能,其一是实现 Comparable 接口,使类具有比较的功能。第二种是实现 Comperator 接口,比较规则定义在该接口提供的 compare 方法中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14class IntervalComparator implements Comparator<Interval> {
public int compare(Interval a, Interval b) {
return a.start - b.start;
}
}
// 其中 Interval 对象定义如下
class Interval {
int start, end;
Interval(int start, int end) {
this.start = start;
this.end = end;
}
}在 Java 8 中,还可以使用 Lambda 表达式创建比较器,如下
1
Arrays.sort(intervals, (Interval x, Interval y) -> x.start - y.start);
代码如下
1 | class Solution { |
本例使用的是贪心思想,如果有冲突,则指针指向最小覆盖区间,这就是贪心的思想。