题意:合并一系列有重合的区间。例如:Given [1,3],[2,6],[8,10],[15,18]
, return [1,6],[8,10],[15,18]
.
分析:按start升序排列,再根据end合并。复杂度为O(nlogn).
代码:
/**
* 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) {
int n=intervals.size();
if(n==0) return intervals;
sort(intervals.begin(),intervals.end(),cmp);
vector<Interval> ans;
Interval v(intervals[0].start,intervals[0].end);
for(int i=1;i<n;++i){
if(intervals[i].start>v.end){
ans.push_back(v);
v.start=intervals[i].start;
v.end=intervals[i].end;
}else{
v.end=max(v.end,intervals[i].end);
}
}
ans.push_back(v);
return ans;
}
static bool cmp(const Interval &a,const Interval &b){
if(a.start==b.start) return a.end<b.end;
else return a.start<b.start;
}
};