给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解题思路:
按照start的大小先排序,再逐个合并
手写快排
/**
* 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) {
vector<Interval>res;
if(intervals.size()==0)return intervals;
int i=1,j=0;
inter_sort(intervals,0,intervals.size()-1);
res.push_back(intervals[0]);
while(i<intervals.size()){
if(intervals[i].start>res[j].end ){
res.push_back(intervals[i]);
j++;
}
else if(res[j].end<=intervals[i].end &&res[j].start>=intervals[i].start){
res[j].start=intervals[i].start;
res[j].end=intervals[i].end;
}
else if(res[j].start<=intervals[i].start &&res[j].end<=intervals[i].end){
res[j].end=intervals[i].end;
}
else if(res[j].start>=intervals[i].start && res[j].end>=intervals[i].end)
res[j].start=intervals[i].start;
i++;
}
return res;
}
private:
//快排
void inter_sort(vector<Interval>& intervals,int low,int high){
if(low<high){
int pivotpos=Partition(intervals,low,high);
inter_sort(intervals,low,pivotpos-1);
inter_sort(intervals,pivotpos+1,high);
}
}
int Partition(vector<Interval>&intervals,int low,int high){
int pivot=intervals[low].start;
int eivot=intervals[low].end;
while(low<high){
while(low<high &&intervals[high].start>=pivot)--high;
intervals[low].start=intervals[high].start;
intervals[low].end=intervals[high].end;
while(low<high &&intervals[low].start<=pivot)++low;
intervals[high].start=intervals[low].start;
intervals[high].end=intervals[low].end;
}
intervals[low].start=pivot;
intervals[low].end=eivot;
return low;
}
};
用sort函数,重载
/**
* 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:
struct cmp{
bool operator()(Interval &l,Interval &r){
return l.start<r.start;
}
}cmp;
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval>res;
if(intervals.size()==0)return intervals;
int i=1,j=0;
sort(intervals.begin(),intervals.end(),cmp);
res.push_back(intervals[0]);
while(i<intervals.size()){
if(intervals[i].start>res[j].end ){
res.push_back(intervals[i]);
j++;
}
else if(res[j].end<=intervals[i].end &&res[j].start>=intervals[i].start){
res[j].start=intervals[i].start;
res[j].end=intervals[i].end;
}
else if(res[j].start<=intervals[i].start &&res[j].end<=intervals[i].end){
res[j].end=intervals[i].end;
}
else if(res[j].start>=intervals[i].start && res[j].end>=intervals[i].end)
res[j].start=intervals[i].start;
i++;
}
return res;
}
};