1 问题
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].
2 分析
题目要合并重叠的区间,直觉上需要将区间排序。排序的方法是:
- 先按照区间左端点排序
- 如果左端点相同,再按照右端点排序
假设排序后的区间为 [[a1,a2],[a3,a4],[a5,a6]...] ,便可以从左到右,逐个合并区间。下面以 [a1,a2],[a3,a4] 为例,根据 a2 与 a3,a4 的位置关系,可以分为以下情况:
- a2<a3 这种情况下,两个区间不需要合并.
- a3≤a2≤a4 这种情况下,这两个区间需要合并,合并后区间的左端点是 a1 , 右端点是 a4 .
- a2>a4 这种情况下, 这两个区间需要合并,合并后区间的左端点是 a1 , 右端点是 a2 .
重复以上步骤,直到所有的区间都被合并处理。
3 代码
public class Solution {
public List<Interval> merge(List<Interval> intervals) {
Collections.sort(intervals,
new Comparator<Interval>(){
public int compare(Interval o1, Interval o2){
if(o1.start != o2.start){
return o1.start - o2.start;
}else{
return o1.end - o2.end;
}
}
}
);
int i = 0;
while(i < intervals.size() - 1){
if(intervals.get(i).end >= intervals.get(i+1).start){
intervals.get(i).end = Math.max(intervals.get(i).end, intervals.get(i+1).end);
intervals.remove(i+1);
}else{
i = i + 1;
}
}
return intervals;
}
}
代码中有以下几点需要注意:
- 使用
Collections.sort
方法对List
进行排序 Comparator<T>()
接口可以使用lambda表达式代替,简化代码while()
循环可以用iterator
代替,使逻辑更加清晰