題目
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].
分析
首先的思路是,將這些區(qū)間按照其開(kāi)始的坐標(biāo)進(jìn)行排序,然后從前往后掃描扰楼,記錄當(dāng)前的起始點(diǎn)和結(jié)束點(diǎn)。如果結(jié)束點(diǎn)大于等于后一個(gè)起始點(diǎn)卷哩,則使用結(jié)束點(diǎn)的最大值來(lái)更新當(dāng)前結(jié)束點(diǎn)昂灵。如果結(jié)束點(diǎn)小于后一個(gè)起始點(diǎn)色鸳,則輸出當(dāng)前起始點(diǎn)和結(jié)束點(diǎn)琉历,并以下一個(gè)區(qū)間來(lái)重置起始點(diǎn)和結(jié)束點(diǎn)坠七。
實(shí)現(xiàn)
/**
* 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;
}
};
思考
這里用到了靜態(tài)函數(shù)成員,其獨(dú)立與對(duì)象存在旗笔,這樣才能在sort函數(shù)中作為參數(shù)使用彪置。
不過(guò)最后的成績(jī)不是很好,主要是sort的O(nlogn)的復(fù)雜度拖慢了速度蝇恶。但是想了半天沒(méi)想到改進(jìn)的方法拳魁,重新提交后發(fā)現(xiàn)之前是系統(tǒng)抽風(fēng)了=_=