56. Merge Intervals
思路:
因为数组中可能有重叠的部分,而重叠的要求是 [L1,R1]和[L2,R2]相比 L2<=R1那么这两个数组就重叠。根据这个性质,我们能得到判断条件
如果R1<L2,那么我们就不用处理重叠,否则我们就需要取R1=max(R1,R2)。为什么是R1等于呢?因为我们默认[L1,R1]在存放结果的数组里面,而[L2,R2]是新拿出的数组用来比较的。所以我们对[L,R]的L进行升序排序,这样就能尽可能的把有重叠的数组放在一起,让重叠的数组尽可能连续。
又考虑到我们存放结果的数组需要有数组被对比,所以我们先把给的数组的第一个数组加入进去。
那么总的做法就是,对原数组排序,定义一个存放结果的数组res,遍历排序后的数组,判断存放结果的数组是否为空或者R1<L2,是就把遍历到的数组加入进res,否则就判断 R1和R2谁大,大的赋值给R1。
代码:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int n=intervals.size();
sort(intervals.begin(),intervals.end());
vector<vector<int>> res;
for(auto& num:intervals){
int l=num[0],r=num[1];
if(res.empty()||res.back()[1]<l){
res.push_back(num);
}
else{
res.back()[1]=max(r,res.back()[1]);
}
}
return res;
}
};
另一种双指针,先把一个指针用来指向一个区间的开始,然后另一个指针一直右移直到指到的区间不再重叠,这个过程会一直寻找最大的右边界。当这个重叠的区间找到后,就移动前一个指针,指向下一个区间的开始。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int n=intervals.size();
sort(intervals.begin(),intervals.end());
vector<vector<int>> res;
for(int i=0;i<n;){
int temp = intervals[i][1];
int j=i+1;
while(j<n&&intervals[j][0]<=temp){
temp = max(temp,intervals[j][1]);
j++;
}
res.push_back({intervals[i][0],temp});
i=j;
}
return res;
}
};