版权声明:转载请联系博主 https://blog.csdn.net/zxtalentwolf/article/details/84039054
Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]] Output: [[1,6],[8,10],[15,18]] Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]] Output: [[1,5]] Explanation: Intervals [1,4] and [4,5] are considerred overlapping.
思路很简单,就是首先排序,这里为了练习快排,所以自己手写了以个排序。
针对intervals进行排序,然后进行类似于mapreduce中的reduce工作一样,进行归并,得到结果,具体看代码。
const int x=[](){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return 0;
}();
class Solution {
public:
void swap(Interval &a, Interval &b){
Interval temp=a;
a=b;
b=temp;
}
void mysqrt(vector<Interval>& intervals, int left, int right){
if(left>=right) return;
int i=left-1;
int j=right;
for(int k=left;k<right;k++){
if(intervals[k].start<intervals[right].start){
i++;
swap(intervals[k],intervals[i]);
}
}
i++;
swap(intervals[i],intervals[right]);
mysqrt(intervals,left,i-1);
mysqrt(intervals,i+1,right);
}
vector<Interval> merge(vector<Interval>& intervals) {
if(intervals.empty()) return intervals;
mysqrt(intervals,0,intervals.size()-1);
vector<Interval> ans;
Interval cur=intervals[0];
for(int i = 1; i < intervals.size(); i++){
if(intervals[i].start <= cur.end){
cur.end=intervals[i].end > cur.end? intervals[i].end : cur.end;
}else{
ans.push_back(cur);
cur=intervals[i];
}
}
ans.push_back(cur);
return ans;
}
};