LeetCode 0057-插入区间

0057-插入区间

说明

示例

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]

解 排序

思路

  1. 将新的区间添加到原区间里去
  2. 根据区间的左边界排序
  3. 遍历循环(见代码)
  • 如果结果集为空, 直接添加
  • 比较结果集最后一项的右边界与当前区间的左边界
    • 前者小, 将当前区间添加到结果集中
    • 前者大, 更新结果集最后一项的右边界

复杂度

  1. 时间复杂度 O ( N l o g N ) O(NlogN) O(NlogN), 排序需要 O ( N l o g N ) O(NlogN) O(NlogN)的时间
  2. 空间复杂度 O ( l o g N ) O(logN) O(logN), 排序需要 O ( l o g N ) O(logN) O(logN)的空间(递归)
class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        res = []
        intervals.append(newInterval)
        intervals.sort(key=lambda x: x[0])
        for i in range(len(intervals)):
            if not res:
                res.append(intervals[i])
            elif res[-1][1] < intervals[i][0]:
                res.append(intervals[i])
            elif res[-1][1] >= intervals[i][0] and res[-1][1] <= intervals[i][1]:
                res[-1][1] = intervals[i][1]
            elif res[-1][1] >= intervals[i][0] and res[-1][1] > intervals[i][1]:
                continue
        return res
class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        res = []
        intervals.append(newInterval)
        intervals.sort(key=lambda x: x[0])
        for i in range(len(intervals)):
            if not res:
                res.append(intervals[i])
            elif res[-1][1] < intervals[i][0]:
                res.append(intervals[i])
            else:
                res[-1][1] = max(res[-1][1], intervals[i][1])
        return res

解2

思路

  1. 对于区间 S 1 = [ l 1 , r 1 ] S_1 = [l_1, r_1] S1=[l1,r1] S 2 = [ l 2 , r 2 ] S_2 = [l_2, r_2] S2=[l2,r2], 如果它们之间没有重叠(没有交集)
  • 说明要么 S 1 S_1 S1 S 2 S_2 S2 的左侧, 此时有 r 1 < l 2 r_1 < l_2 r1<l2
  • 要么 S 1 S_1 S1 S 2 S_2 S2 的右侧,此时有 l 1 > r 2 l_1 > r_2 l1>r2
  • 如果 r 1 < l 2 r_1 < l_2 r1<l2 l 1 > r 2 l_1 > r_2 l1>r2 二者均不满足, 说明 S 1 S_1 S1 S 2 S_2 S2 必定有交集, 它们的交集即为
    [ max ⁡ ( l 1 , l 2 ) , min ⁡ ( r 1 , r 2 ) ] [\max(l_1, l_2), \min(r_1, r_2)] [max(l1,l2),min(r1,r2)]
    并集即为
    [ min ⁡ ( l 1 , l 2 ) , max ⁡ ( r 1 , r 2 ) ] [\min(l_1, l_2), \max(r_1, r_2)] [min(l1,l2),max(r1,r2)]
  1. 当我们遍历到区间 [ l i , r i ] [l_i, r_i] [li,ri] 时:
  • 如果 r i < left r_i < \textit{left} ri<left, 说明 [ l i , r i ] [l_i, r_i] [li,ri]S 不重叠并且在其左侧, 我们可以直接将 [ l i , r i ] [l_i, r_i] [li,ri] 加入res
  • 如果 l i > right l_i > \textit{right} li>right, 说明 [ l i , r i ] [l_i, r_i] [li,ri]S 不重叠并且在其右侧, 我们可以直接将 [ l i , r i ] [l_i, r_i] [li,ri] 加入res
  • 如果上面两种情况均不满足,说明 [ l i , r i ] [l_i, r_i] [li,ri]S 重叠, 我们无需将 [ l i , r i ] [l_i, r_i] [li,ri] 加入res. 此时, 我们需要将 S [ l i , r i ] [l_i, r_i] [li,ri] 合并, 即将 S 更新为其与 [ l i , r i ] [l_i, r_i] [li,ri] 的并集

复杂度

  1. 时间复杂度 O ( N ) O(N) O(N)
  2. 空间复杂度 O ( 1 ) O(1) O(1)
class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        newLeft, newRight = newInterval
        res = []
        placed = False
        for left, right in intervals:
            if newRight < left:
                if not placed:
                    res.append([newLeft, newRight])
                    placed = True
                res.append([left, right])
            elif right < newLeft:
                res.append([left, right])
            else:
                newLeft = min(left, newLeft)
                newRight = max(right, newRight)
        if not placed:
            res.append([newLeft, newRight])
        return res
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值