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]
.
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
解题思路:我一开始想先按照起始端点将newInterval插入到intervals中,然后依次合并重合区间。看似时间复杂度只要O(n),但是对于向量,插入和删除的时间都不是O(1) , 所以总的时间复杂度并不是O(n), 所以当区间数量变大,时间复杂度会大幅度增加,会出现TLE ;
其实思路是一样的,只是重新定义一个二维向量,将处理好后的区间加入到向量中,这个时间复杂度是O(1) , 遍历所有区间,时间复杂度是O(n) ;
将newInterval前与之不重合的区间加入到res中:
while(cur < n && intervals[cur][1] < newInterval[0])
{
res.push_back(intervals[cur++]) ;
}
处理与newInterval重合的区间:
while(cur < n && intervals[cur][0] <= newInterval[1])
{
newInterval[0] = min(intervals[cur][0] , newInterval[0]) ;
newInterval[1] = max(intervals[cur][1] , newInterval[1]) ;
cur++;
}
res.push_back(newInterval) ;
将剩下的区间加入到res中:
while(cur < n)
{
res.push_back(intervals[cur++]) ;
}
return res ;
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval)
{
vector<vector<int>> res ;
int cur= 0 ;
int n = intervals.size() ;
while(cur < n && intervals[cur][1] < newInterval[0])
{
res.push_back(intervals[cur++]) ;
}
while(cur < n && intervals[cur][0] <= newInterval[1])
{
newInterval[0] = min(intervals[cur][0] , newInterval[0]) ;
newInterval[1] = max(intervals[cur][1] , newInterval[1]) ;
cur++;
}
res.push_back(newInterval) ;
while(cur < n)
{
res.push_back(intervals[cur++]) ;
}
return res ;
}
};