题目要求
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]
.
解题思路
这道题的意思十分地简单明了,就是题目给出一些区间,我们要把这些区间合并成一个个没有交集的区间。
我们可以这么来做:
- 先把这些区间排序:按照区间的开始时间升序排序,如果开始时间相同的就按照结束时间升序排序。
- 从左到右遍历排好序的区间,检查是否有需要合并的。因为已经排好序了,所以每次只要检查相邻的两个区间就可以了。
使用一个向量来保存结果,每次从区间列表取出一个区间,加入到结果向量中,如果有需要合并的就进行合并。直到区间列表里所有的区间都被遍历了。
代码实现
bool cmps(Interval i1, Interval i2){
if(i1.start==i2.start) return i1.end<i2.end;
else return i1.start<i2.start;
}
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
sort(intervals.begin(),intervals.end(),cmps);
vector<Interval> ans;
int i=0;
int len = intervals.size();
while(i<len){
Interval now = intervals[i];
i++;
if(ans.empty()) ans.push_back(now);
else {
Interval oback=ans.back();
if(now.start<=oback.end&&now.end>=oback.end){
Interval newi(oback.start,now.end);
ans.pop_back();
ans.push_back(newi);
}
else if(now.start<=oback.end&&now.end<=oback.end){
}
else ans.push_back(now);
}
}
return ans;
}
};
复杂度分析
程序中使用了algorithm
库里的sort
函数,时间复杂度是O(nlogn)。
遍历区间列表的时间是O(n)。
所以总的时间复杂度是O(nlogn)。