题目
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]
.
合并有交集的区间,先对区间按照start排序,只需要考虑相邻元素前者的end和后者的start决定是否合并,合并时候选择两者中最大的end,因为可能出现[1,4],[2,3]的情况,最后需要对结尾进行处理,考虑最后一个元素是否合并并加入res,同时考虑候选集只有一个元素的情况。比较函数使用了仿函数和sort算法。
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
struct cmp{
bool operator()(Interval I1,Interval I2){//自定义比较函数
return I1.start<I2.start;
}
};
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> res;
if(intervals.empty())
return res;
sort(intervals.begin(),intervals.end(),cmp());//先按照start大小升序排序,这样只需要比较相邻元素中前者的end和后者的start看是否有交叉,如果有则合并,否则当前合并的区间加入res,并且将后者作为新的区间开始
Interval tmp=intervals[0];
for(int i=1;i<intervals.size();++i){
if(intervals[i].start>tmp.end){//相邻元素无交叉,则tmp加入res,当前区间作为新的区间开始
res.push_back(tmp);
tmp=intervals[i];
}
else{
tmp.end=max(tmp.end,intervals[i].end);//区间合并时选择end最大的,可能会有[[1,4],[2,3]]的情况
}
}
if(res.empty()||tmp.end!=res[res.size()-1].end){//res为空则候选区间只有一个元素,直接入res即可,后一个条件比较tmp和当前res的最后一个元素看是否相等,如果相等则表示最后一个元素参与了合并,如果不相等则最后一个元素单独作为新区间加入res
res.push_back(tmp);
}
return res;
}
};