以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
按左端点从小到大排序,相同的话再按右端点来排。
一开始先放第一个元素到另一个容器里,然后遍历剩下的元素,假如可以跟另一个容器里的尾部元素合并的话,就更新尾部元素,假如不能的话,就放到尾部元素。
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
// 比较函数,按照区间的起始位置排序
static bool cmp(vector<int>& a, vector<int>& b) {
return a[0] < b[0] || (a[0] == b[0] && a[1] < b[1]);
}
// 检查两个区间是否可以合并
bool canMerge(vector<int>& interval1, vector<int>& interval2) {
return interval1[1] >= interval2[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
// 首先按照区间的起始位置排序
sort(intervals.begin(), intervals.end(), cmp);
vector<vector<int>> mergedIntervals;
for (auto& interval : intervals) {
// 如果结果列表为空,或者当前区间的起始位置大于结果列表中最后区间的结束位置,
// 则不能合并,直接添加到结果列表中
if (mergedIntervals.empty() || !canMerge(mergedIntervals.back(), interval)) {
mergedIntervals.push_back(interval);
} else {
// 否则,可以合并,更新结果列表中最后区间的结束位置
mergedIntervals.back()[1] = max(mergedIntervals.back()[1], interval[1]);
}
}
return mergedIntervals;
}
};