一、问题描述

二、解题思路
可以使用自定义排序+依次合并的方法来解决这个问题。
(1)首先,对intervals向量进行排序,重写比较器,按照区间左边界从小到大排序,使得有重叠区域的区间相邻;
(2)start和end用于记录当前区间之前的上一合并完的区间的情况
<1>如果当前区间和它有重叠部分,就进行一个合并;
<2>如果没有,就将start和end维护的区间加入ret,更新start和end的值;
注意:i==intervals.size()-1时,需要将现在的start和end维护的区间加入ret!!
三、代码实现
cpp
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
//排序+合并
vector<vector<int>> ret;
//特殊情况处理
if(intervals.size()==0) return ret;
//正常情况
sort(intervals.begin(),intervals.end(),[](const vector<int>a,const vector<int>b){
return a[0]<b[0];
});
//区间合并
int start=intervals[0][0],end=intervals[0][1];//记录当前区间的左右边界
for(int i=0;i!=intervals.size();i++){
if(end>=intervals[i][0])
end=max(end,intervals[i][1]);
else if(end<intervals[i][0]){
ret.push_back({start,end});
start=intervals[i][0];end=intervals[i][1];
}
if(i==intervals.size()-1)
ret.push_back({start,end});
}
return ret;
}
};