• 【LeetCode】57. 插入区间


    1 问题

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

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

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

    示例 3:

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

    示例 4:

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

    示例 5:

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

    2 答案

    自己写的,参照上一题,进行简单修改,把新的区间append,然后重新合并即可

    class Solution:
        def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
    
            intervals.append(newInterval)
            intervals.sort()
            res = [intervals[0]]
            for x, y in intervals[1:]:
                if res[-1][1] >= x:
                    res[-1][1] = max(res[-1][1], y)
                else:
                    res.append([x, y])
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述
    再次尝试,逻辑有些混乱,不是很清晰

    class Solution:
        def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
            if not intervals: return [newInterval]
            if newInterval[1] < intervals[0][0]: return [newInterval] + intervals
            if newInterval[0] > intervals[-1][1]: return intervals + [newInterval] 
            res = []
            i = 0
            n = len(intervals)
            while i < n and newInterval[0] > intervals[i][1]:
                res.append(intervals[i])
                i += 1
            left = min(intervals[i][0], newInterval[0])
            while i < n and newInterval[1] > intervals[i][1]:
                i += 1
            if i < n and newInterval[1] >= intervals[i][0]:
                right = intervals[i][1]
                i += 1
            else:
                right = newInterval[1]
            res.append([left, right])
            while i < n:
                res.append(intervals[i])
                i += 1
            return res
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    官方解,比较常规的思路

    class Solution:
        def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
            i = 0
            n = len(intervals)
            res = []
            while i < n and newInterval[0] > intervals[i][1]: # 两个区间边界不相交
                res.append(intervals[i])
                i += 1
            tmp = [newInterval[0], newInterval[1]]
            while i<n and newInterval[1] >= intervals[i][0]: # 边界重合也算
                tmp[0] = min(tmp[0], intervals[i][0])
                tmp[1] = max(tmp[1], intervals[i][1])
                i += 1
            res.append(tmp)
            while i < n:
                res.append(intervals[i])
                i += 1
            return res
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    https://leetcode.cn/problems/insert-interval/solutions/5507/chang-gui-si-kao-by-powcai/

  • 相关阅读:
    07 ConfigMap/Secret:怎样配置、定制我的应用
    抽象代数精解【9】
    年轻人应该做长期并能提升自己的兼职副业
    虚拟列表 - Vue3实现一个可动态改变高度的虚拟滚动列表
    按位异或的应用
    python import相关内容简单介绍
    7、MySQL Workbench 导出导入数据库
    tensorflow笔记
    i18n在VUE3中使用插槽动态传入组件
    “计算机艺术之父”、现代计算机技术先驱查理斯·苏黎去世,享年99岁
  • 原文地址:https://blog.csdn.net/CSDNLHCC/article/details/133949039