Leetcode 57:插入区间(超详细的解法!!!)

给出一个*无重叠的 ,*按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 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] 重叠。

解题思路

这个问题其实和之前问题Leetcode 56:合并区间(最详细的解法!!!)解法是一样的,我们只需要将newInterval添加到intervals中去,然后再使用之前问题的代码就可以通过了。

class Solution:
    def insert(self, intervals, newInterval):
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """
        intervals.append(newInterval)
        if len(intervals) < 2:
            return intervals
        
        intervals.sort(key=lambda x: x.start)
        result = list()
        for item in intervals:
            if not result or result[-1].end < item.start:
                result.append(item)
            else:
                result[-1].end = max(result[-1].end, item.end)
    
        return result

但是因为题目条件中告诉我们区间是有序的,所以我们有一种更加合适的解法。主要分成如下几种情况考虑。

所以我们现将前面没有交集的区间先添加到res中去,也就是

while i < inter_len and intervals[i].end < newInterval.start:
    res.append(intervals[i])
    i += 1

接着就是对上述四中情况的判断

  • newInterval.start = min(newInterval.start, intervals[i].start)
  • newInterval.end = max(newInterval.end, intervals[i].end)
while i < inter_len and intervals[i].start <= newInterval.end:
    newInterval.start = min(newInterval.start, intervals[i].start)
    newInterval.end = max(newInterval.end, intervals[i].end)
    i += 1

最后将剩余的区间添加过去即可。

class Solution:
    def insert(self, intervals, newInterval):
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """
        inter_len = len(intervals)
        res, i = list(), 0
        while i < inter_len and intervals[i].end < newInterval.start:
            res.append(intervals[i])
            i += 1
            
        while i < inter_len and intervals[i].start <= newInterval.end:
            newInterval.start = min(newInterval.start, intervals[i].start)
            newInterval.end = max(newInterval.end, intervals[i].end)
            i += 1
            
        res.append(newInterval)
        while i < inter_len:
            res.append(intervals[i])
            i += 1
                
        return res

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值