题目链接:Merge Intervals

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]. 

这道题的要求是将给定的一组间隔中有重叠的进行合并。

将间隔合并,首先要找到相邻的间隔,然后看其是否有重叠,如果有,就进行合并。

因此,首先考虑对数组排序。排序的时候,只需要按照间隔的起始时间排序即可。然后遍历数组,当前一个间隔的结束时间不小于当前间隔的开始时间,说明有重叠,需要进行合并。合并的时候,新的间隔的结束时间等于这两个间隔结束时间的最大值。

实现过程中,先将第一个间隔放到新数组中,然后从第二个开始往后遍历,如果有重叠,就改变新数组中最后元素的结束时间;如果没有重叠,就添加到新数组中即可。

时间复杂度:O(nlogn)

空间复杂度:O(n)

 1 bool cmp(Interval i1, Interval i2)
 2 {
 3     return i1.start < i2.start;
 4 }
 5 
 6 class Solution
 7 {
 8 public:
 9     vector<Interval> merge(vector<Interval> &intervals)
10     {
11         vector<Interval> vi;
12 
13         if(intervals.size() == 0)
14             return vi;
15 
16         sort(intervals.begin(), intervals.end(), cmp);
17 
18         vi.push_back(intervals[0]);
19         for(int i = 1; i < intervals.size(); ++ i)
20         {
21             if(vi[vi.size() - 1].end >= intervals[i].start)
22                 vi[vi.size() - 1].end = max(vi[vi.size() - 1].end, intervals[i].end);
23             else
24                 vi.push_back(intervals[i]);
25         }
26         return vi;
27     }
28 };