Problem:
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]
.
Analysis:
Solutions:
C++:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
if(intervals.empty()) {
intervals.push_back(newInterval);
return intervals;
}
int start = newInterval.start;
int end = newInterval.end;
vector<Interval>::iterator start_it = intervals.begin();
for(; start_it != intervals.end(); ++start_it) {
if(start_it->end >= newInterval.start)
break;
}
if(start_it == intervals.end()) {
intervals.push_back(newInterval);
return intervals;
} else {
if(start_it->start > end) {
intervals.insert(start_it, newInterval);
return intervals;
} else if(start_it->end >= end || start_it + 1 == intervals.end() || (start_it + 1)->start > end) {
start_it->start = min(start, start_it->start);
start_it->end = max(end, start_it->end);
return intervals;
} else
start_it->start = min(start, start_it->start);
}
vector<Interval>::iterator end_it = start_it + 1;
for(; end_it != intervals.end(); ++end_it) {
if(end_it->end >= end)
break;
}
if(end_it == intervals.end())
start_it->end = end;
else {
if(end_it->start <= end) {
start_it->end = max(end, end_it->end);
++end_it;
} else
start_it->end = end;
}
intervals.erase(start_it + 1, end_it);
return intervals;
}
Java
:
Python: