题目:
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].
个人解析与理解:1.给定的collection 没有说明有序,所以要对它先进性排序(根据start的值)。用JAVA的 comparator 时间复杂度为nlogn, 空间复杂度为O(1)。
2. 剩下的很简单,只要明白什么条件下合并即刻。因为我们对interval 已经进行了排序,现在唯一不确定的就是上一个interval的end是否大于下一个interval的start。如果前一个end > 下一个的start, 那么进行合并。
3. 最后当遍历完最后一个interval时, 如果他跟目前面重叠,就会把他合并但没有加入;如果他们有跟前面重叠,就会加入前面整理好的intverval 不加入它自身,所以我们要最后再加一下。
具体Java 代码如下:
/**
* 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 {
private class MyComp implements Comparator<Interval>{
public int compare(Interval a, Interval b){
return a.start - b.start;
}
}
public List<Interval> merge(List<Interval> intervals) {
if (intervals.size() <=1)
return intervals;
List<Interval> rst = new ArrayList<Interval>();
Collections.sort(intervals, new MyComp());
int start = intervals.get(0).start;
int end = intervals.get(0).end;
for(int i = 1; i < intervals.size(); i++){
Interval tmp = intervals.get(i);
if(tmp.start <= end)//case of overlapping interval, get the biggest end value
end = Math.max(end, tmp.end);
else{//the tmp interval does not overlap with previous interval
rst.add(new Interval(start, end));
start = tmp.start;//the new start and end is updated
end = tmp.end;
}
}
rst.add(new Interval(start, end));//add the last interval
return rst;
}
}