题目
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].
分析
首先的思路是,将这些区间按照其开始的坐标进行排序,然后从前往后扫描,记录当前的起始点和结束点。如果结束点大于等于后一个起始点,则使用结束点的最大值来更新当前结束点。如果结束点小于后一个起始点,则输出当前起始点和结束点,并以下一个区间来重置起始点和结束点。
实现
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if(intervals.empty()) return {};
vector<Interval> ans;
sort(intervals.begin(), intervals.end(), Less);
int i=1;
int tmp1=intervals[0].start, tmp2=intervals[0].end;
while(i<intervals.size()){
if(tmp2>=intervals[i].start){
tmp2 = max(tmp2, intervals[i].end);
}
else{
ans.push_back(Interval(tmp1, tmp2));
tmp1 = intervals[i].start;
tmp2 = intervals[i].end;
}
i++;
}
ans.push_back(Interval(tmp1, tmp2));
return ans;
}
static bool Less (const Interval& a, const Interval& b) {
return a.start < b.start;
}
};
思考
这里用到了静态函数成员,其独立与对象存在,这样才能在sort函数中作为参数使用。
不过最后的成绩不是很好,主要是sort的O(nlogn)的复杂度拖慢了速度。但是想了半天没想到改进的方法,重新提交后发现之前是系统抽风了=_=