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]
.
贴一个比较巧的办法,可惜没过大集合,TLE了。 不过思路很巧,不去update intervals,而是去update newInterval. 一直 循环,可惜因为vector的操作本身是O(N)所以,其实算是个O(N2)最差的。。。。
#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) {}
};
class Solution {
public:
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
vector<Interval>::iterator it=intervals.begin();
while(it!=intervals.end()){
if (newInterval.end<it->start){
intervals.insert(it,newInterval);
return intervals;
} else if (newInterval.start>it->end){
it++;
} else {
newInterval.start=min(newInterval.start,it->start);
newInterval.end=max(newInterval.end,it->end);
it=intervals.erase(it);
}
}
intervals.push_back(newInterval);
return intervals;
}
};
然后看了yu的code,其实还是很简单但是O(N)的操作,首先按照start 插入, O(n), 然后再merge,还是O(n).
class Solution {
public:
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
vector<Interval>::iterator it=intervals.begin();
vector<Interval> res;
if (intervals.size()==0){
res.push_back(newInterval);
return res;
}
while(it!=intervals.end()){
if (it->start>newInterval.start){
intervals.insert(it,newInterval);
break;
}
it++;
}
if (it==intervals.end())
intervals.push_back(newInterval);
res.push_back(intervals[0]);
for (int i=1; i<intervals.size(); i++){
if (res.back().end<intervals[i].start){
res.push_back(intervals[i]);
} else {
res.back().end=max(res.back().end,intervals[i].end);
}
}
return res;
}
};