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]
.
例如,
给定 [1,3],[2,6],[8,10],[15,18],
返回 [1,6],[8,10],[15,18]。
分析:
先将各区间按照左边界(若左边界相等,按右边界)排序,然后再合并。当一个区间的右边界大于另一个区间的左边界时,不需要合并,否则区间有重合,这时只需要用大的右边界作为该区间的右边界,重复此过程。
注意:不要忘记最后一个合并区间。
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
int intervalsSize = intervals.size();
if(intervalsSize == 0 || intervalsSize == 1)
{
return intervals;
}
//对 interval 按 start 的升序排序
sort(intervals.begin(), intervals.end(), intervalComp);
vector<Interval> retv;
Interval inter(intervals[0].start, intervals[0].end);
for(int index = 1; index < intervalsSize;)
{
if(inter.end < intervals[index].start) //无区间重合,直接把前一个区间放入已合并和的 vector 中
{
retv.push_back(inter);
inter.start = intervals[index].start;
inter.end = intervals[index].end;
}
else if(inter.end < intervals[index].end) //区间有重合,直接用大边界代替
{
inter.end = intervals[index].end;
}
if(index + 1 == intervalsSize) //原数组中无区间待合并,将临时区间加入合并好区间
{
retv.push_back(inter);
}
++index;
}
return retv;
}
static bool intervalComp(Interval& val1, Interval& val2)
{
if(val1.start == val2.start) //start相等,则按 end 升序排列
{
return (val1.end < val2.end);
}
return (val1.start < val2.start);
}
};