题目链接: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 };