您的位置:首页 > 编程语言 > Java开发

【LeetCode】merge intervals

2017-06-26 11:16 375 查看
题目:

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode java