leetcode 57.插入区间

题目:

给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。

在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。

返回插入之后的 intervals

注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。

题目示例:

示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 2:
输入: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] 重叠。

代码:

class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        result=[]
        count=0
        if not intervals:
            result.append(newInterval)
            return result
        for content in intervals:
            if content[1]<newInterval[0]:#小于左边界
                result.append(content)
            elif content[0]>newInterval[1]:#大于右边界
                if not result or result[-1][1]<newInterval[0]: #当大于的时候,检查是否插入
                    result.append(newInterval)
                result.append(content)
            elif newInterval[0]<=content[1] and count==0: #当不满足上面两种情况时,说明在区间内部,且没有插入时,进入代码块,结果增加
                result.append(content)
                result[-1][0]=min(content[0],newInterval[0])
                result[-1][1]=max(content[1],newInterval[1])
                count=1
            elif newInterval[0]<=content[1] and count==1: #已插入时,持续更新右端点
                result[-1][1]=max(content[1],newInterval[1])
        if newInterval[0]>result[-1][1]:#最终没有插入
            result.append(newInterval)
        return result

代码思路:

代码逻辑:

result结果列表,重点在第二点在区间时怎么处理

我采用的时,当没有放入结果列表时,取并集,然后放入之后,如果还在区间内部的话,持续更新右端点。

时间复杂度:O(n),其中 n 是数组 intervals 的长度,即给定的区间个数。

空间复杂度:O(1)。除了存储返回答案的空间以外,我们只需要额外的常数空间即可。

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值