总感觉题意不是很明确。
所以代码不停的修改去适应给出的例子与其他输入。。。
先按区间的左元素快速排序,之后可以合并的区间必然是相邻的。
注意用来排序的对象与排序算法中交换操作的对象是不同的。
排序之后需要进行合并,需要合并的区间都是连续的,利用双指针在序列里找到可以合并的区间,一边找一遍合并。合并结束之后更新beg,end指针到刚才合并区间的下一个
,继续寻找。
class Solution {
public:
int partition(vector<vector<int>> &a, int beg, int end){
auto &key = a[end]; //探针为key[0]
while(beg < end){
while(beg < end && a[beg][0] <= key[0])
++beg;
while(beg < end && a[end][0] >= key[0])
--end;
swap(a[beg], a[end]);
}
swap(key, a[beg]);
return beg;
}
void quicksort(vector<vector<int>> &a, int beg, int end){
if(beg >= end) return;
auto p = partition(a, beg, end);
quicksort(a, beg, p-1);
quicksort(a, p+1, end);
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int n = intervals.size();
quicksort(intervals, 0, n-1);
vector<vector<int>> vec;
int beg = 0;
int end = beg;
while( end < n-1){
while(end < n-1 && intervals[end][1] >= intervals[end+1][0]){
intervals[end+1][1] = max(intervals[end][1], intervals[end+1][1]);
++end;
}
intervals[end][0] = intervals[beg][0];
vec.push_back(intervals[end]);
beg = end +1;
end = beg;
}
if(end == n-1) vec.push_back(intervals[end]); //最后只剩下一个元素的情况
return vec;
}
};
上面我是自己写了快排,如果嫌麻烦的话,这样也是可以排序的:
sort(intervals.begin(), intervals.end());
不过性能并不太好。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int n = intervals.size();
sort(intervals.begin(), intervals.end());
vector<vector<int>> vec;
int beg = 0;
int end = beg;
while( end < n-1){
while(end < n-1 && intervals[end][1] >= intervals[end+1][0]){
intervals[end+1][1] = max(intervals[end][1], intervals[end+1][1]);
++end;
}
intervals[end][0] = intervals[beg][0];
vec.push_back(intervals[end]);
beg = end +1;
end = beg;
}
if(end == n-1) vec.push_back(intervals[end]); //最后只剩下一个元素的情况
return vec;
}
};
换种写法:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());
int beg = 0, end = 0;
vector<vector<int>> res;
while(end < intervals.size()){
int a = intervals[beg][0], b = intervals[beg][1];
while(end < intervals.size()-1 && b >= intervals[end+1][0]){
b = max(b, intervals[end+1][1]);
++end;
}
res.push_back({a, b});
beg = end + 1;
end = beg;
}
if(end == intervals.size()-1) res.push_back(intervals[end]);//只剩下一个元素
return res;
}
};