leetcode57. 插入区间

给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

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

找到第一个interval.end>=new.start的位置,在该位置插入new,从该位置开始向后合并:
# Definition for an interval.
# class Interval:
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution:
    def insert(self, intervals, newInterval):
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """
        # 找到第一个interval.end>=new.start的位置
        loc = 0
        for i, interval in enumerate(intervals):
            if newInterval.start <= interval.end:
                break
            loc += 1
        intervals.insert(loc, newInterval)
        while loc < len(intervals) - 1:
            if intervals[loc].end >= intervals[loc+1].start:
                intervals[loc].start = min(intervals[loc].start, intervals[loc+1].start)
                intervals[loc].end = max(intervals[loc].end, intervals[loc+1].end)
                intervals.remove(intervals[loc+1])
            else:
                break
        return intervals
二分找loc:
# Definition for an interval.
# class Interval:
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution:
    def insert(self, intervals, newInterval):
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """
        # 找到第一个interval.end>=new.start的位置
        loc = self.bi_search(intervals, newInterval)
        intervals.insert(loc, newInterval)
        while loc < len(intervals) - 1:
            if intervals[loc].end >= intervals[loc+1].start:
                intervals[loc].start = min(intervals[loc].start, intervals[loc+1].start)
                intervals[loc].end = max(intervals[loc].end, intervals[loc+1].end)
                intervals.remove(intervals[loc+1])
            else:
                break
        return intervals

    def bi_search(self, all, one):
        left, right = 0, len(all)
        while left < right:
            mid = (left+right) // 2
            if all[mid].end < one.start:
                left = mid+1
            else:
                right = mid
        return left
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值