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) {
size_t size = intervals.size();
if (size == 0) return vector<Interval>();
sort(intervals.begin(), intervals.end(), comp);
vector<Interval> ret(1, intervals[0]);
for (size_t i = 1; i != size; ++i) {
Interval val = intervals[i];
Interval& lastVal = * ret.rbegin();
size_t retSize = ret.size();
if (val.start > lastVal.end) // [1 2] [3 5]
ret.push_back(val);
else if (val.end > lastVal.end) // [2 6] [4 7]
lastVal.end = val.end;
// [2 6] [4 5]
}
return ret;
}
private:
struct Comp {
bool operator() (const Interval& a, const Interval& b) {
return a.start < b.start;
}
} comp;
};
参考后
/**
* 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) {
size_t size = intervals.size();
if (size == 0) return vector<Interval>();
vector<Interval> ret;
vector<int> start;
vector<int> end;
for (size_t i = 0; i != intervals.size(); ++i) {
start.push_back(intervals[i].start);
end.push_back(intervals[i].end);
}
sort(start.begin(), start.end());
sort(end.begin(), end.end());
int tmpStart = start[0];
for (size_t i = 1; i != size; ++i) {
if (start[i] > end[i - 1]) {
ret.push_back(Interval(tmpStart, end[i - 1]));
tmpStart = start[i];
}
}
ret.push_back(Interval(tmpStart, end[size - 1]));
return ret;
}
};