一、题目描述
力扣链接:力扣56.合并区间
以数组intervals
表示若干个区间的集合,其中单个区间为intervals[i] = [start, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
二、C++题解
将这些区间按区间左值从小到大排序,对于几个相交的区间,最终合并生成的区间结果的左区间一定是这些区间中左值最小的,而区间右值一定是这些区间中右值最大的。
cpp
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> result;
sort(intervals.begin(), intervals.end());
result.push_back(intervals[0]); // 先把第一个丢进去
for (int i = 0; i < intervals.size(); ++i) {
auto& curr = intervals[i]; // 当前区间的引用
auto& last = result.back(); // 已经整理好的最后一个区间
if (curr[0] <= last[1]) { // 如果当前区间的左区间比已经存好的区间的右区间小
last[1] = max(last[1], curr[1]); // 修改存储区间的右区间
}
else {
result.push_back(curr);
}
}
return result;
}
};