1. 题目描述
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 基础解法
思路:排序 + 双指针。
- 当区间个数小于2个时候,即不需要合并,直接返回原数组;
- 准备两个数组,分别存放目标二维数组的每个一维数组的第一位和第二位,将其排序。
- 注意,合并的步骤是判断starts[i + 1] > ends[i],因为下一个合并区间的开始要大于上一个上一个合并区间的结束。同时要使用双指针,j用来保存合并区间的开始,i用来指向合并区间的结束,i是不断往前走,直到满足上面的式子,然后压入到res中,同时,将j同步到i的位置。
- 注意,在i迭代过程中别溢出了。
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int n = intervals.size();
if(n < 2) return intervals;
vector<vector<int>> res;
vector<int>starts;
vector<int>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]){
res.push_back({starts[j], ends[i]});
j = i + 1;
}
}
return res;
}