以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
如果我们按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的。如下图所示,标记为蓝色、黄色和绿色的区间分别可以合并成一个大区间,它们在排完序的列表中是连续的:
class Solution {
public:
//设定比较器
static bool cmp(const vector<int>& a, const vector<int>& b)
{
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> ans;
//使用系统提供排序行数,加入自定义比较器
//先按照区间左端点排序
sort(intervals.begin(), intervals.end(), cmp);
//遍历所有区间
for(int i = 0; i < intervals.size(); i++)
{
int left = intervals[i][0];
int right = intervals[i][1];
if( ans.size() == 0 || ans.back()[1] < left)
{
ans.push_back({left, right});
}
else
{ int preright = ans.back()[1] ;
//ans.back()[1] >= left 上一个区间右边与当前遍历到的区间有重合
//比较大小,用大的替换
ans.back()[1] = max(preright, right);
}
}
return ans;
}
};