题目描述
给出一个区间的集合,请合并所有重叠的区间。
样例
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]。
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
算法
(排序) $O(n \log n)$
- 首先将所有区间按照
start
排序,start
相同的按照end
排序。 - 从头开始遍历所有区间,并求他们的并集。定义
cur
表示当前一些区间的并集。 - 若发现当前遍历到的区间
start
严格大于cur
的end
,则当前并集需要加入到答案数组中,且更新区间并集cur
为当前区间。 - 若发现当前遍历到的区间
end
严格大于cur
的end
,则更新cur
的end
为当前区间的end
。
时间复杂度
- 排序的时间复杂度为 $O(n \log n)$,排序后只需要线性扫描,故总时间复杂度为 $O(n \log n)$。
空间复杂度
- 需要额外 $O(n)$ 的空间存储答案。
C++ 代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int n = intervals.size();
sort(intervals.begin(), intervals.end(),
[&](const vector<int> &x, const vector<int> &y) {
if (x[0] != y[0])
return x[0] < y[0];
return x[1] < y[1];
});
vector<vector<int>> ans;
if (n == 0)
return ans;
vector<int> cur = intervals[0];
for (int i = 1; i < n; i++) {
if (intervals[i][0] > cur[1]) {
ans.push_back(cur);
cur = intervals[i];
} else if (intervals[i][1] > cur[1])
cur[1] = intervals[i][1];
}
ans.push_back(cur);
return ans;
}
};
感谢大佬的提供的如此清晰思路的代码 为我等后辈学习代码提升了无数的效率
大佬总的时间复杂度是$nlogn$吧hh
手误已修正hh
请问为什么比较函数cmp要用static呢?
因为C++的STL规定比较函数必须是静态或全局的,即在无需声明对象的情况下也能使用。
嗷嗷 好的 谢谢~ 猪年大吉哈