题目
给定若个个区间,并将有重叠的区间进行合并。最终返回没有重叠的所有区间。
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
原题链接: https://leetcode-cn.com/problems/merge-intervals/
思路
首先将数组进行一次排序。排序的方式是,按区间起始坐标升序排列。如 [[1,3],[2,6],[1,5],[8,10],[15,18]],排序过后是 [[1,3],[1,5],[2,6],[8,10],[15,18]]。
然后从第一个区间开始,与第二个区间进行比较,判断是否有重叠,如果有重叠,则进行合并,然后再和下一个区间进行比较。如果没有重叠,则可以将前者区间push到结果当中,然后更新当前的区间。
对于 sort 函数,自定义 comp 函数需要加 static 静态成员函数声明。
- 复杂度分析
- 时间复杂度 O(nlogn)。排序复杂度为O(nlogn),后面区间遍历复杂度为O(n)
- 空间复杂度 O(1)
代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> results;
if (intervals.empty()) {
return results;
}
sort(intervals.begin(), intervals.end(), comp);
vector<int> pre = intervals[0];
for (int i = 1; i < intervals.size(); i++) {
vector<int> cur = intervals[i];
// 有重叠
if (cur[0] >= pre[0] && cur[0] <= pre[1]) {
pre[1] = max(pre[1], cur[1]);
}
else {
results.push_back(pre);
pre = cur;
}
}
results.push_back(pre);
return results;
}
static bool comp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
};