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]
.
给定一些间隔的集合,合并所有有重叠的间隔。
从题目中给的例子来看,可以发现,如果下一个间隔的start小于当前间隔的end的时候,两个间隔可以合并。题目中给的间隔 是按照间隔的start有序排列的,如果给定的间隔无序并且间隔比较多的话,例如[1,3],[8,10],[2,6],[4,5]......这时需要对间隔按照start进行排序,然后对每个间隔,比较它的end和下一个间隔的start的大小,如果end<下一个间隔的start则将这个新的间隔加入到要返回的结果中,如果不小于,说明两个间隔没有重叠,那么让start,end等于新的间隔的start和end即可。代码如下:
if(intervals.size()<=1){
return intervals;
}
//按照每个间隔的start的大小,按升序排序(这里使用的是匿名函数)
intervals.sort((i1, i2)->Integer.compare(i1.start, i2.start));
List<Interval> res = new LinkedList<Interval>();
int start = intervals.get(0).start;
int end = intervals.get(0).end;
//比较下一个间隔的start与当前间隔的end
for(Interval interval:intervals){
if(interval.start<=end){
end = Math.max(end, interval.end);
}else{
res.add(new Interval(start, end));
start = interval.start;
end = interval.end;
}
}
//把最后一个间隔加上
res.add(new Interval(start, end));
return res;