- 首先对区间首端点从小到大进行排序。然后如果开始端点相同,end按照降序排列
- 脑子中画出这些排序的区间,由底到高画。
- 一共就分为3中情况,最后一种覆盖又分为起始点不同的覆盖,以及起始点相同的覆盖。
- 对于延长区间只有一种情况,就是第二段的end比最后一段end长,这时候直接更新已有end就行。
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<Interval> merge(vector<Interval> &intervals) {
sort(intervals.begin(),intervals.end(),[](Interval a, Interval b){
if(a.start==b.start){
return a.end > b.end;
}else{
return a.start< b.start;
}
});
vector<Interval> res;
for(int i =0; i< intervals.size();i++){
if(res.empty() || res.back().end< intervals[i].start){//为空或者是end 大于start,不可能相交
res.push_back(intervals[i]);//放入
}else{
if(res.back().end< intervals[i].end){
res.back().end = intervals[i].end;//满足合并条件,更新end位置
}
}
}
return res;
}
};