题目
Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
题意
给出一个间隔的集合,合并所有重叠的间隔。
比如,
给出 [1,3],[2,6],[8,10],[15,18]
,
返回: [1,6],[8,10],[15,18]
.
分析
如下图:
……1…2…3………6……8……10……………15……..18……
……[XXOOO]……………[XXXXX]……………[XXXXXX]…….
………..[OOOXXXXX]…………………………………………….
例子中,只有[1,3]
和[2,6]
有重叠,把它们合并到[1,6]
,最后得到没有重叠的间隔:[1,6],[8,10],[15,18]
通过上面,我们很容易看出,两个间隔[start1, end1],[start2, end2]重叠的条件是,end1 < start2。
我们只需要把intervals按照start进行从小到达的排序,遍历排序后的intervals,只要碰到end(i) > start(i+1),则合并这两个interval为[start(i), end(i+1)];
这样做的时间复杂度为对start进行排序所用到的复杂度,最坏情况不会超过O(n)
代码
vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.empty()) return vector<Interval>{};
vector<Interval> res;
sort(intervals.begin(), intervals.end(), [](Interval a, Interval b){return a.start < b.start;});
res.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); i++) {
if (res.back().end < intervals[i].start) res.push_back(intervals[i]);
else
res.back().end = max(res.back().end, intervals[i].end);
}
return res;
}
169 / 169 test cases passed.
Runtime: 15 ms