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:
Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]
Example 2:
Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
Output: [[1,2],[3,10],[12,16]]
Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].
Example 3:
Input: intervals = [], newInterval = [5,7]
Output: [[5,7]]
Example 4:
Input: intervals = [[1,5]], newInterval = [2,3]
Output: [[1,5]]
Example 5:
Input: intervals = [[1,5]], newInterval = [2,7]
Output: [[1,7]]
Constraints:
0 <= intervals.length <= 104
intervals[i].length == 2
0 <= intervals[i][0] <= intervals[i][1] <= 105
intervals
is sorted byintervals[i][0]
in ascending order.newInterval.length == 2
0 <= newInterval[0] <= newInterval[1] <= 105
Solutions
🧠 Cpp
class Solution
{
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval)
{
//input check
if(intervals.empty())
return {newInterval};
vector<vector<int>> res;
res.reserve(intervals.size() + 1);
int a = newInterval[0], b = newInterval[1];
//find interval that could be altered to contain newInterval
auto iter = begin(intervals),
iter_end = end(intervals);
for(;iter < iter_end; ++iter)
{
int &x1 = iter->at(0), &x2 = iter->at(1);
//booster to find correct element
if(a > x1 && a > x2 && next(iter) != iter_end)
{
res.emplace_back(*iter);
continue;
}
break;
}
//return {*iter};
//alter this interval or insert new before interval it
{
int &x1 = iter->at(0), &x2 = iter->at(1);
//(x1,a,b,x2) fully included
if( x1 <= a && b <= x2 )
return intervals;
//(a,x1,x2,b) fully included
if( a <= x1 && x2 <= b )
{
*iter = newInterval;
}
else if( a == x2 )
{
x2 = b;
}
//(a,x1,b,x2)
else if( a < x1 && x1 <= b )
{
x1 = a;
}
//(x1,a,x2,b)
else if( a <= x2 && x2 < b)
{
x2 = b;
}
//(a,b,x1,x2) //we can insert a new interval right before iter
else if(x1 >= b)
{
iter = intervals.insert(iter, newInterval);//insert whole interval at prev pos
}
else if(next(iter) == iter_end)
{
if(a <= x2)
x2 = b;
else
{
res.emplace_back(*iter);
iter = intervals.insert(iter_end, newInterval);
}
}
}
//return {*iter};
//check that intervals after modified/inserted one are not overlaping
a = iter->at(0), b = iter->at(1);
iter_end = end(intervals);
auto finish_iter = next(iter);
if(finish_iter != iter_end)
for(;next(finish_iter) != iter_end; finish_iter++)
{
int &x1 = finish_iter->at(0), &x2 = finish_iter->at(1);
if(b == x1 || b <= x2)
{
break;
}
if( b < next(finish_iter)->at(0))
{
break;
}
}
//take right valur from last overlapping
if(finish_iter != iter_end)
{
int &x1 = finish_iter->at(0), &x2 = finish_iter->at(1);
if(b >= x1)
{
if(x2 > b)
iter->at(1) = x2;
finish_iter++;
}
}
//at this point we finished with our interval,
//all other intervals after it is not overlapping
res.emplace_back(*iter);
for(;finish_iter != iter_end; finish_iter++)
res.emplace_back(*finish_iter);
return res;
}
};
Last updated
Was this helpful?