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 {
static bool myfunction (Interval i,Interval j) { return (i.start<j.start); }
bool canMerge(Interval i, Interval j) { return i.end >= j.start; }
Interval merge(Interval i, Interval j) {
int newstart = i.start < j.start ? i.start : j.start;
int newend = i.end > j.end ? i.end : j.end;
return Interval(newstart, newend);
}
public:
vector<Interval> merge(vector<Interval> &intervals) {
vector<Interval> results;
if(intervals.size() == 0) return results;
sort(intervals.begin(), intervals.end(), Solution::myfunction);
results.push_back(intervals[0]);
for(int ii = 1; ii < intervals.size(); ii ++) {
if(canMerge(results[results.size() - 1], intervals[ii])) {
results[results.size() - 1] = merge(results[results.size() - 1], intervals[ii]);
}
else {
results.push_back(intervals[ii]);
}
}
return results;
}
};