Insert Interval
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].
10/7/2015 update
Insert the newInterval to the original interval vector, and copy the algorithm in the Merge Interval question.
/**
* 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> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> ans;
intervals.push_back(newInterval);
sort(intervals.begin(), intervals.end(), [](Interval a, Interval b){
return a.start < b.start;
});
Interval it;
bool valid = false;
for(auto interval : intervals){
if(valid == false){
it = interval;
valid = true;
}
else{
if(interval.start <= it.end){
it.end = max(it.end, interval.end);
}
else{
ans.push_back(it);
it = interval;
}
}
}
if(valid == true) ans.push_back(it);
return ans;
}
};
区域覆盖问题。
二分查找找到应该覆盖的pos。然后向后扩展覆盖原来的interval。
很奇怪,目测是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:
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
if(intervals.empty() || newInterval.start > (*(intervals.end() - 1)).end){//empty or bigger than last element, push it!
intervals.push_back(newInterval);
}
else if(newInterval.end < intervals[0].start){//newInterval is smaller than the first element
intervals.insert(intervals.begin(), newInterval);
}
else{//find the proper position to insert
int pos = find(intervals, newInterval.start, 0, intervals.size());
//intervals[pos].start <= netInterval.start, and intervals[pos] is the last element whose start < newInterval.start
if(intervals[pos].end >= newInterval.start){//overlap with pos
vector<Interval>::iterator it = intervals.begin();
int right = newInterval.end;
while((it + pos + 1) != intervals.end() && (*(it + pos + 1)).start <= right){
right = max(right, (*(it + pos + 1)).end);
intervals.erase(it + pos + 1);
}
intervals[pos].end = max(right, intervals[pos].end);
//pos may be 0, it may new.start < pos.start
intervals[pos].start = min(intervals[pos].start, newInterval.start);
}
else{//not overlap with pos
vector<Interval>::iterator it = intervals.begin();
int right = newInterval.end;
while((it + pos + 1) != intervals.end() && (*(it + pos + 1)).start <= right){
right = max(right, (*(it + pos + 1)).end);
intervals.erase(it + pos + 1);
}
newInterval.end = right;
intervals.insert(it + pos + 1, newInterval);
}
}
return intervals;
}
//[start, end)
int find(vector<Interval> &intervals, int val, int start, int end){
if(end - start == 1){
return start;
}
int mid = (start + end) / 2;
if(intervals[mid].start <= val){
return find(intervals, val, mid, end);
}
else{
return find(intervals, val, start, mid);
}
}
};
更新:
遍历整个intervals,对于newInterval,有如下几种情况:

分情况处理,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:
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
for(vector<Interval>::iterator it = intervals.begin(); it != intervals.end(); it++){
if(newInterval.start > (*it).end){
continue;
}
else if(newInterval.end < (*it).start){
intervals.insert(it, newInterval);
return intervals;
}
else{
newInterval.start = min(newInterval.start, (*it).start);
newInterval.end = max(newInterval.end, (*it).end);
intervals.erase(it);
it--;
}
}
intervals.push_back(newInterval);
return intervals;
}
};