• 【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/

  • 相关阅读:
    vivado产生报告阅读分析6-时序报告2
    Oracle的 dblink 学习笔记
    Nacos 是如何同时实现AP与CP的
    基于java+springboot+mybatis+vue+elementui的甜品蛋糕销售商城网站
    YoloV8改进策略:复现HIC-YOLOv5,打造HIC-YOLOv8,用于小物体检测
    操作系统-(第一章上)
    MATLAB循环结构之while语句
    停车场系统、智慧城市停车、智慧社区、物业管理、新能源充电、人脸门禁 uniapp 系统源码
    51单片机毕业设计开题报告建议
    C语言每日一题(21)删除排序数组中的重复项
  • 原文地址:https://blog.csdn.net/CSDNLHCC/article/details/133949039