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) {
// Start typing your C/C++ solution below
// if intervals are sorted. it would be easy.
if( intervals.size() <= 1) return intervals;
insertion_sort( intervals );
vector<Interval> rel;
Interval base = intervals[0];
rel.push_back( base );
for( int i=1; i< intervals.size(); i++) {
Interval & pre = rel.back();
Interval & next = intervals[i];
if( pre.end < next.start ) {
rel.push_back( next );
} else if( pre.end < next.end) {
pre.end = next.end;
} // otherwise, do nohting since base case has already included the new one.
}
return rel;
}
void insertion_sort( vector<Interval> &intervals ) {
for( int i=1; i< intervals.size(); i++) {
Interval temp = intervals[i];
int j=i-1;
while(j>=0) {
if(intervals[j].start>temp.start || (intervals[j].start==temp.start && intervals[j].end>temp.end) ) {
intervals[j+1] = intervals[j];
j--;
} else {
break;
}
}
intervals[j+1] = temp;
}
}
};
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
// Start typing your Java solution below
// DO NOT write main() function
ArrayList<Interval> res = new ArrayList<Interval>();
int sz = intervals.size();
if(sz<1) return res;
Collections.sort(intervals, new IntervalComparator());
res.add(new Interval(intervals.get(0).start, intervals.get(0).end ) ); //this won't modify the original input.
for(int i=1; i<sz; i++) {
Interval last = res.get(res.size()-1);
Interval x = intervals.get(i);
if(last.end < x.start) {
res.add( new Interval(intervals.get(i).start, intervals.get(i).end ) );
} else if( last.end < x.end) {
last.end = x.end;
}
}
return res;
}
class IntervalComparator implements Comparator<Interval>{
public int compare(Interval a, Interval b) {
if(a.start < b.start) return -1;
else if(a.start>b.start) return 1;
else {
if(a.end<b.end) return -1;
else if(a.end>b.end) return 1;
else return 0;
}
}
}
}