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]
思路:先按起始位置对每个区间排序,然后逐个扫描添加:若当前元素与之前添加到列表的最后一个元素有重叠,则修改之前添加的最后一个元素使其包含当前元素,否则就把当前元素添加至列表。
反证法证明:程序判断条件是每个区间按起始位置大小排列且相邻区间有重叠则合并,若算法不正确,则存在如下情况:对于区间i,j,k (i<j<k),i与j、j与k均不可合并(因为程序的判断条件),而i与k可合并(假设算法不正确),则:
ints[i].end<ints[j].start
ints[j].end<ints[k].start
ints[i].end≥ints[k].start
然而:
ints[i].end<ints[j].start≤ints[j].end<ints[k].start
ints[i].end≥ints[k].start
矛盾,原算法正确。
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public class Comparartable implements Comparator<Interval>{
public int compare(Interval a,Interval b){
return (a.start<b.start)?-1:(a.start==b.start)?0:1;
}
}
public List<Interval> merge(List<Interval> intervals) {
Collections.sort(intervals,new Comparartable());
LinkedList<Interval> merge =new LinkedList<Interval>();
for(Interval i:intervals){
if(merge.isEmpty()||i.start>merge.getLast().end){
merge.add(i);
}else{
merge.getLast().end = Math.max(merge.getLast().end,i.end);
}
}
return merge;
}
}