Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
public class IntervalComparator implements Comparator<Interval> {
public int compare(Interval i0, Interval i1) {
return i0.start - i1.start;
}
}
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
if (intervals == null || intervals.size() < 2) {
return intervals;
}
Collections.sort(intervals, new IntervalComparator());
ArrayList<Interval> result = new ArrayList<Interval>();
Interval last = intervals.get(0);
for (int i = 1; i < intervals.size(); i++) {
Interval curt = intervals.get(i);
if (last.end >= curt.start) {
last.end = Math.max(curt.end, last.end);
} else {
result.add(last);
last = curt;
}
}
result.add(last);
return result;
}
首先按照 start 的递增顺序将整个 ArrayList sort 一下。使用 Collections.sort 和 comparator
然后标记一个 last 和 一个 curt。
curt代表当前访问的interval, last 表示之前所有可以merge的intervals 在 merge 之后的一个整体的interval,但还没有被加到result中,因为不确定下面还有没有更多的interval可以被merge到这个last中。直到遇到一个curt, 不能再merge到这个last中,就把这个last加入到result,而当前的curt成为了新的last。
由于 start是已经sort好的,后面的start保证不小于前面的start,所以只需要调整last的end即可。
这个last和curt的问题也可以很形象地理解为泡泡。last就是curt之前的大泡泡,当它遇到一个符合条件的下一个泡泡(curt),就把它merge进来,形成一个更大的泡泡。直到这个大泡泡不能merge更多的泡泡,就把它加入到result中