思路:
先根据start值排序,然后两两merge,每一次的merge,将无用的那个区间的start值大于end值,最后delete这样的非法区间。
时间复杂度O(NlogN),空间复杂度O(N)。
/**
* 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:
void quick_sort(vector<Interval> &array, int left, int right) {
if(left < right) {
int i = left;
int j = right;
Interval x = array[i];
while(i < j) {
while(i < j && array[j].start >= x.start) {
--j;
}
if(i < j) {
swap(array[i], array[j]);
++i;
}
while(i < j && array[i].start < x.start) {
++i;
}
if(i < j) {
swap(array[i], array[j]);
--j;
}
}
array[i] = x;
quick_sort(array, left, i - 1);
quick_sort(array, i + 1, right);
}
}
void clear(Interval &x) {
x.start = 1;
x.end = 0;
}
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> res;
if(intervals.empty()) return res;
// sort
quick_sort(intervals, 0, intervals.size() - 1);
// merge
for(int i = 0; i < intervals.size() - 1; ++i) {
if(intervals[i + 1].start <= intervals[i].end) {
intervals[i + 1].start = intervals[i].start;
intervals[i + 1].end = intervals[i].end > intervals[i + 1].end ? intervals[i].end : intervals[i + 1].end;
clear(intervals[i]);
}
}
// delete
for(int i = 0; i < intervals.size(); ++i) {
if(intervals[i].end >= intervals[i].start) {
res.push_back(intervals[i]);
}
}
return res;
}
};