- 首先对区间首端点从小到大进行排序。然后如果开始端点相同,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; } };