给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
这是一道模拟的题目,首先按照区间左端点排序,然后合并区间,合并的时候注意前一段区间包含后一段区间的情况[1,4],[2,3]。以及正常情况[1,3],[2,6]
注意这里的代码写法,每次只需将上一次区间的左端点和右端点存下来即可
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res;
if(intervals.size()==0)
return res;
// 先按区间起点排序,再合并重叠的区间
sort(intervals.begin(),intervals.end(),[](const vector<int> &a,const vector<int> &b)
{return a[0]<b[0];});
int last_start, last_end; // 上一个区间的起点和终点
for(int i=0;i<intervals.size();i++){
if(i==0){
last_start = intervals[0][0];
last_end = intervals[0][1];
}
else{
if(intervals[i][0]>last_end){
res.push_back(vector<int>{last_start, last_end});
last_start = intervals[i][0];
last_end = intervals[i][1];
}
else if(intervals[i][1]>last_end){
last_end = intervals[i][1];
}
}
}
res.push_back(vector<int>{last_start, last_end});
return res;
}
};