Problem: Given a collection of intervals, merge all overlapping intervals.
Solution:先按interval.start按升序进行冒泡排序,再逐一进行merge(如i1和i2比较,若可以merge再i1和后续比较,不可以merge则i2和i3等比较merge)。
Problem:冒泡排序耗时太长。
Modification:直接在merge过程中进行排序比较,若出现swap则flag设置为0,稍后需要对整个vector再进行排序和merge的过程。
另 需要注意vector.erase()的用法,erase指针p所指item后,指针p指向删除item后一个item。
class Solution {
//bubbleSort,can be commented.
void sortIntervals(vector<Interval> &intervals){
int i,j;
int intervalsSize=intervals.size();
//cout<<intervalsSize<<endl;
for(i=0;i<intervalsSize-1;i++){
for(j=0;j<intervalsSize-i-1;j++)
if(intervals[j].start>intervals[j+1].start){
Interval tmp(intervals[j].start,intervals[j].end);
intervals[j]=intervals[j+1];
intervals[j+1]=tmp;
}
}
return;
}
//merge the *p1 and *p2 intervals
public:
/**
* @param intervals: interval list.
* @return: A new interval list.
*/
vector<Interval> merge(vector<Interval> &intervals) {
if(!intervals.size())
return intervals;
vector<Interval>::iterator p;
//sortIntervals(intervals);
int flag=1;
int tmpStart,tmpEnd;
while(1){
flag=1;
for(p=intervals.begin();p<intervals.end()-1;p++){
if(p->start>(p+1)->start){
//swap
tmpStart=p->start;tmpEnd=p->end;
p->start=(p+1)->start;p->end=(p+1)->end;
(p+1)->start=tmpStart;(p+1)->end=tmpEnd;
flag=0;
p--;
continue;
}
if(p->end>=(p+1)->start){
p->end=max(p->end,(p+1)->end);
intervals.erase(p+1);
p--;
}
}
if(flag)
break;
}
return intervals;
}
};