56.合并区间
思路:排序+双指针
1.sort排序nums
2.外层i遍历区间,内层j遍历i+1开始的区间
记录一个maxEnd,为能合并的区间的最右侧端点值
比较j的左端点与之前的右端点(maxEnd),
(1)小于等于就是能合并的连续区间,更新maxEnd,移动j看下一个区间
(2)大于时循环结束,此时j的位置为下一个可合并区间的第一个元素,记录结果,移动i到j
代码:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end());
int n=intervals.size();
int i=0;
int j=0;
int maxEnd=intervals[0][1];//第一个区间的右边界
while(i<n){
int maxEnd=intervals[i][1];
j=i+1;
while(j<n && intervals[j][0]<=maxEnd){ //j的左端点小于之前的最大右端点 能合并
maxEnd=max(maxEnd,intervals[j][0]); //取最大右端点
j++;
}
res.push_back({intervals[i][0],maxEnd});
i=j;//移动i跨过已经合并好的j区间
}
return res;
}
};