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]
.
/**
* 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> r;
if(intervals.size()==0) {
r.push_back(newInterval);
return r;
}
int a = newInterval.start, b=newInterval.end;
vector<Interval>::iterator ia;
vector<Interval>::reverse_iterator ib;
Interval t;
for(ia=intervals.begin();ia!=intervals.end();ia++) {
if(a < (*ia).start) {
t.start = a;
break;
} else if(a >= (*ia).start && a <= (*ia).end) {
t.start = (*ia).start;
break;
}
}
if(ia == intervals.end()) {
r.assign(intervals.begin(),intervals.end());
r.push_back(newInterval);
return r;
}
for(ib=intervals.rbegin();ib!=intervals.rend();ib++) {
if(b > (*ib).end) {
t.end = newInterval.end;
break;
} else if(b >= (*ib).start && b <= (*ib).end) {
t.end = (*ib).end;
break;
}
}
if(ib == intervals.rend()) {
r.assign(intervals.begin(),intervals.end());
r.insert(r.begin(),newInterval);
return r;
}
if(ia != intervals.begin()) {
r.insert(r.begin(),intervals.begin(),ia);
}
r.push_back(t);
if(ib != intervals.rbegin()) {
r.insert(r.end(),ib.base(),intervals.end());
}
return r;
}
};
算法不难, O(n),细节需要好好注意,我这个版本写了不少的边界检查。
算法的可改进:因为是排好序的,可以用二分法查找,O(logn)复杂度。
我再也不用迭代器了!!!!!!