题目既然要求合并数组,我们可以选择对数组的起始位置和截止位置进行排序,然后一步步比较来排除重复的区间。对于该思路我们可以用双指针来遍历,当 i 区间的右端点小于排序后i + 1区间的左端点,不用进行处理,继续遍历,当大于左端点时,将 i 的左端点和i + 1 的右端点组成一个新区间。代码如下:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int n = intervals.size();
vector<vector<int>> res;//二维数组储存结果
vector<int> starts,ends;
for(int i = 0;i < n;i++){
starts.push_back(intervals[i][0]);//储存左端点
ends.push_back(intervals[i][1]);//储存右端点
}
sort(starts.begin(),starts.end());//排序
sort(ends.begin(),ends.end());
for(int i = 0,j = 0;i < n;i++){
if(i == n - 1 || starts[i + 1] > ends[i]){//i的右端点大于i+1的左端点
res.push_back({starts[j],ends[i]});//将区间合并
j = i + 1;//指针右移
}
}
return res;
}
};