Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Given intervals [1,3],[6,9]
, insert and merge [2,5]
in
as [1,5],[6,9]
.
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16]
, insert and merge [4,9]
in
as [1,2],[3,10],[12,16]
.
This is because the new interval [4,9]
overlaps with [3,5],[6,7],[8,10]
.
#include<iostream>
#include<vector>
using namespace std;
struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval){
vector<Interval> vI;
if(intervals.size()==0){
vI.push_back(newInterval);
return vI;
}
int left=0,right=intervals.size()-1,mid;
while(left<=right){
mid=left+(right-left)/2;
if(intervals[mid].start<newInterval.start) left=mid+1;
if(intervals[mid].start>=newInterval.start) right=mid-1;//保证:退出时right指示的元素的左边界值比start小
}
//这里返回后,left指示的元素的左边界值比start大或者相等,right指示的元素的左边界值比start小,但是right指示的元素的右边界值不知道是否比start大。
int left2=right,right2=intervals.size()-1;//left从right开始查找,可以加快查找速度
while(left2<=right2){
mid=left2+(right2-left2)/2;
if(intervals[mid].end<=newInterval.end) left2=mid+1;//保证:退出时left指示的元素的右边界比end大
if(intervals[mid].end>newInterval.end) right2=mid-1;
}
//这里返回后,left指示的元素的右边界值比end大,right指示的元素的右边界值比end小或者相等,但是left指示的元素的左边界值不知道是否比end小。
int templeft=0;
if(right>=0 && intervals[right].end>=newInterval.start){
newInterval.start=intervals[right].start;
templeft=right;
}
else templeft=left;
int tempright=0;
if(left2<intervals.size() && intervals[left2].start<=newInterval.end){
newInterval.end=intervals[left2].end;
tempright=left2+1;
}
else tempright=left2;
for(int i=0;i<templeft;i++)
vI.push_back(intervals[i]);
vI.push_back(newInterval);
for(int i=tempright;i<intervals.size();i++)
vI.push_back(intervals[i]);
return vI;
}
int main(){
vector<Interval> vI;
vector<vector<int>> vvi;
Interval newInterval;
// vvi={{1,3},{6,9},{12,15}};
// newInterval={4,5};//1 3 ,4 5,6 9,12 15
// vvi={{1,3},{6,9},{12,15}};
// newInterval={4,6};//1 3 ,4 9,12 15
// vvi={{1,3},{6,9},{12,15}};
// newInterval={2,3};//1 3,6 9,12 15
// vvi={{1,3},{6,9},{12,15}};
// newInterval={3,5};// 1 5,6 9, 12 15
// vvi={{1,3},{6,9},{12,15}};
// newInterval={3,6};//1 9,12 15
// vvi={{1,3},{6,9},{12,15}};
// newInterval={-1,0};//-1 0,1 3,6 9,12 15
// vvi={{1,3},{6,9},{12,15}};
// newInterval={16,19};//1 3,6 9,12 15,16 19
// vvi={{1,3},{6,9},{12,15},{18,21},{25,28}};
// newInterval={8,23};//{8,20},{8,26};
vvi={{1,5}};
newInterval={0,0};//{2,3};
for(auto vieh:vvi){
vI.push_back(Interval(vieh[0],vieh[1]));
}
vector<Interval> vIres=insert(vI,newInterval);
for(auto Ieh:vIres){
cout<<Ieh.start<<" "<<Ieh.end<<endl;
}
return 0;
}