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