Problem:
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]
.
Analysis:
1. Brute-force method.
2. Sort.
Solution:
Brute-force solution:
bool isIntersection(Interval &int1, Interval &int2){
if(int1.end<int2.start || int2.end<int1.start) return false;
return true;
}
void mergeIntervalsToFirst(Interval &int1, Interval &int2){
if(int1.start>int2.start) int1.start=int2.start;
if(int1.end<int2.end) int1.end=int2.end;
}
vector<Interval> merge(vector<Interval> &intervals) {
vector<Interval> rint;
if(intervals.size()==0) return rint;
int len=intervals.size();
bool isMerge=false;
for(int i=0; i<len; ++i){
if(i==0) rint.push_back(intervals[0]);
else{
int lenRint=rint.size();
for(int j=0; j<lenRint; ++j){
if(isIntersection(rint[j], intervals[i])){
mergeIntervalsToFirst(rint[j], intervals[i]);
//Check after intervals whether to be included.
std::vector<Interval>::iterator iter=rint.begin()+j+1;
while(iter!=rint.end()){
if(isIntersection(rint[j], *iter)){
mergeIntervalsToFirst(rint[j], *iter);
rint.erase(iter);
}else ++iter;
}
isMerge=true;
break;
}
}
if(!isMerge) rint.push_back(intervals[i]);
else isMerge=false;
}
}
return rint;
}