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].
第一种方法:主要用了太多erase操作,需要移动后面的所有操作,容易费时
class Solution {
public:
static bool comp(const Interval &a, const Interval &b)
{
return a.start<b.start;
}
vector<Interval> merge(vector<Interval>& intervals)
{
if(intervals.empty())
return intervals;
sort(intervals.begin(),intervals.end(),comp);
int i;
vector<Interval>::iterator iter;
for(i=1;i<intervals.size();)
{
if(intervals[i].start<=intervals[i-1].end&&intervals[i].end>intervals[i-1].end)
{
intervals[i-1].end=intervals[i].end;
iter=intervals.begin()+i;
intervals.erase(iter);
}
else if(intervals[i].start<=intervals[i-1].end&&intervals[i].end<=intervals[i-1].end)
{
iter=intervals.begin()+i;
intervals.erase(iter);
}
else
i++;
}
return intervals;
}
};
第二种方法:
这道题的要求是将给定的一组间隔中有重叠的进行合并。
将间隔合并,首先要找到相邻的间隔,然后看其是否有重叠,如果有,就进行合并。
因此,首先考虑对数组排序。排序的时候,只需要按照间隔的起始时间排序即可。然后遍历数组,当前一个间隔的结束时间不小于当前间隔的开始时间,说明有重叠,需要进行合并。合并的时候,新的间隔的结束时间等于这两个间隔结束时间的最大值。
实现过程中,先将第一个间隔放到新数组中,然后从第二个开始往后遍历,如果有重叠,就改变新数组中最后元素的结束时间;如果没有重叠,就添加到新数组中即可。
时间复杂度:O(nlogn)
空间复杂度:O(n)
class Solution {
public:
static bool comp(const Interval &a, const Interval &b)
{
return a.start<b.start;
}
vector<Interval> merge(vector<Interval>& intervals)
{
if(intervals.size()<=1)
return intervals;
sort(intervals.begin(),intervals.end(),comp);
int i;
vector<Interval>ret;
Interval node1=intervals[0];
for(i=1;i<intervals.size();i++)
{
Interval node2=intervals[i];
if(node1.end<node2.start)
{
ret.push_back(node1);
node1=node2;
}
else
{
node1.end=node2.end>node1.end?node2.end:node1.end;
}
}
ret.push_back(node1);
return ret;
}
};