leetcode 57. 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].

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 ;
    }
};

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值