以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]] 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]] 输出:[[1,5]] 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
如图所示,如果后边区间的开始端点位置小于等于前边区间结束端点的位置,就说明这两个区间是重叠的,即intervals[j][0]<=intervals[i][1]
故本题的解题思路如下:
- 对区间按照开始端点进行排序,以方便判断重叠区间
- 定义一个结果数组res,将第一个区间放入到res中,遍历区间数组intervals
- 如果intervals[i][0]<=res.back()[1],说明当前遍历到的区间与res中的区间产生了重叠,此时只需更新res的尾端点即可,选取最大的尾端点
- 否则说明遍历到的区间与res中的区间与res中的区间没有产生重叠,故直接放入res结果集中即可
代码
- class Solution {
- public:
- vector
int>> merge(vectorint>>& intervals) { - if(intervals.size()==0) return {};
- //排序
- sort(intervals.begin(),intervals.end(),
- [](const vector<int>& v1,const vector<int>& v2)
- {
- return v1[0]
0]; - });
-
- vector
int>> res; - res.emplace_back(intervals[0]);
-
- for(int i=1;i
size();i++) - {
- //有重叠就合并
- if(intervals[i][0]<=res.back()[1])
- res.back()[1]=max(res.back()[1],intervals[i][1]);
- //无重叠就直接加入
- else
- res.emplace_back(intervals[i]);
- }
- return res;
- }
- };