题目
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、按区间头递增排序;
2、从头开始向后扫描:将临时区间设为第0个区间
2.1、后一个区间的头小于临时区间的尾,将两者合并;
2.2、后一个区间的头大于临时区间的尾,将临时区间插入输出结果,将后一个区间作为新的临时区间;
代码:
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
bool cm(const Interval &i1,const Interval &i2); //按头位置递增排序
class Solution {
public:
vector<Interval> merge(vector<Interval> &intervals) {
vector<Interval> ans;
sort(intervals.begin(),intervals.end(),cm); //排序
int len=intervals.size();
if(len==0)
return ans;
Interval itemp; //临时数据,用于合并操作
itemp.start=intervals[0].start;
itemp.end=intervals[0].end;
for(int i=1;i<len;i++) //扫描,合并
{
if(intervals[i].start<=itemp.end) //后面的头小于前面的尾,合并
itemp.end=max(intervals[i].end,itemp.end);
else //不能再合并,压入,取新的区间
{
ans.push_back(itemp);
itemp.start=intervals[i].start;
itemp.end=intervals[i].end;
}
}
ans.push_back(itemp); //处理最后一个
return ans;
}
};
bool cm(const Interval &i1,const Interval &i2)
{
return i1.start<i2.start;
}