题目:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。(相邻区间也算重叠)
本题和前面几道题思路相似,都是判断区间重叠,但重叠后的具体操作不同,本题需要合并区间,我原本想通过两个int型变量来记录合并区间的开始位置和终止位置,若不重叠则存放结果,但导致当前不重叠区间没有存放进结果中,所以错误。
正确思路应该是,将区间存入结果数组中,若区间重叠,则更改数组中最后一个区间的终止位置,改为两者中的最大值,若区间不重叠,则将新的区间存入数组中,这样就更新了下一区间的起始和终止位置。
代码如下:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> result;
if (intervals.size() == 0) return result; // 区间集合为空直接返回
// 排序的参数使用了lambda表达式
sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});
// 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并
result.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); i++) {
if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间
// 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的
result.back()[1] = max(result.back()[1], intervals[i][1]);
} else {
result.push_back(intervals[i]); // 区间不重叠
}
}
return result;
}
};