分析
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例
输入:
[[1,3],[2,6],[8,10],[15,18]]
输出:
[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠,将它们合并为 [1,6]。
题解
排序+双指针
思路
-
按区间左端点排序,保证区间从左到右排布;
-
遍历,维护当前合并后的区间:
-
如果下一个区间左端点 ≤ 当前区间右端点 → 重叠,合并,更新右端取两者最大值;
-
否则不重叠,把当前区间存入答案,更新为新区间。
-
代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> ans;
if (intervals.empty()) return ans;
sort(intervals.begin(), intervals.end());
vector<int> cur = intervals[0];
for(int i = 1; i < intervals.size(); i++) {
int start = intervals[i][0];
int end = intervals[i][1];
if (start <= cur[1]) {
cur[1] = max(cur[1], end);
} else {
ans.push_back(cur);
cur = intervals[i];
}
}
ans.push_back(cur);
return ans;
}
};
时间复杂度:,主要开销是排序;遍历是 空间复杂度: 排序栈开销;返回结果不计入。

