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]
.
package ustc.zyy.LeetCode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
/*
* @admin zhang yin ye
* zyyjiao@mail.ustc.edu.cn
* */
//定义区间的结构 [start,end]
public class Intervals {
class Interval {
int start;
int end;
public Interval() {
// TODO Auto-generated constructor stub
start = 0;
end = 0;
}
public Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
// 合并区间的函数
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
if (intervals == null || intervals.size() <= 1)
return intervals;
// 对区间按照start排序
Collections.sort(intervals, new IntevalComparator());
// 定义返回结果的list
ArrayList<Interval> result = new ArrayList<Interval>();
// 获得列表的第一个区间
Interval prev = intervals.get(0);
// 遍历后面的区间
for (int i = 1; i < intervals.size(); i++) {
Interval curr = intervals.get(i);
// 如果当前的区间的start<prev的end 表示两者之间有重叠的部分
if (prev.end > curr.start) {
// 下面这个就是合并的形式
Interval merge = new Interval(prev.start, Math.max(prev.end,
curr.end));
// 把合并以后的区间给当前引用
prev = merge;
} else {
// 否则就说明没有重叠的部分 直接把结果加到列表里就可以了
result.add(prev);
// 把遍历的curr给prev
prev = curr;
}
}
result.add(prev);
return result;
}
// 下面是定义的比较器 使用了Collections.sort需要传入一个比较强对象
class IntevalComparator implements Comparator<Interval> {
@Override
public int compare(Interval o1, Interval o2) {
// TODO Auto-generated method stub
return o1.start - o2.start;
}
}
}