LeeCode 57. Insert Interval

简介: 给定一组非重叠间隔,在间隔中插入新间隔(必要时合并)。您可以假设间隔最初是根据其开始时间排序的。

v2-ce59f8586ff3e579839fb7a7c8df4317_1440w.jpg


Description


Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).


You may assume that the intervals were initially sorted according to their start times.


Example 1:

Input: intervals = 1,3],[6,9, newInterval = [2,5]

Output: 1,5],[6,9


Example 2:

Input: intervals = 1,2],[3,5],[6,7],[8,10],[12,16, newInterval = [4,8]

Output: 1,2],[3,10],[12,16

Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].


描述



给定一组非重叠间隔,在间隔中插入新间隔(必要时合并)。

您可以假设间隔最初是根据其开始时间排序的。


思路



  • 这一道题是第五十六题Merge Intervals的演变,所以解题思路非常相似,只是多了一步插入而已,第五十六题在这里,解析在这里.
  • 这道题是要求向已经按起始位置排好序的区间中插入一个新区间,如果插入导致了区间有重叠则需要合并区间
  • 因此思路如下
  1. 找到原始区间中 第一个 区间起始位置大于需要插入区间 的区间
  2. 在此位置插入区间
  3. 对重叠的区间进行合并:检查当前区间起始位置是否在上一个区间之间,若是:检查当前区间的结束位置是否大于上一个区间,如果大于则更新上一个区间的结束位置,然后删除当前区间;如果没有在上一个区间之间,则什么也不做,继续判断下一个区间


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]
        """
        # 如果intervals为空,则直接返回newInterval,注意返回的形式为数组
        if not intervals:
            return [newInterval]
        # 初始化i表示起始索引,count表示intervals中的个数
        i, count = 0, len(intervals)
        # 找到intervals中第一个start值比newInterval大的位置
        while i < count and newInterval.start > intervals[i].start:
            i += 1
        # 在此位置插入
        intervals.insert(i, newInterval)
        # count总数加一
        count += 1
        i = 1
        while i < count:
            # 如果当前位置的区间起始位置在上一个区间之间
            if intervals[i-1].start <= intervals[i].start <= intervals[i-1].end:
                # 如果当前位置区间的结束大于上一个区间,则更新上一个区间的结束位置
                if intervals[i].end > intervals[i-1].end:
                    intervals[i-1].end = intervals[i].end
                # 删除当前的区间
                del intervals[i]
                # 区间总数减一
                count -= 1
                # 索引减一
                i -= 1
            i += 1
        return intervals


源代码文件在这里.

目录
相关文章
|
JavaScript 索引
LeetCode 436. Find Right Interval
Given a set of intervals, for each of the interval i, check if there exists an interval j whose start point is bigger than or equal to the end point of the interval i, which can be called that j is on the "right" of i.
65 0
LeetCode 436. Find Right Interval
LeetCode contest 177 5169. 日期之间隔几天 Number of Days Between Two Dates
LeetCode contest 177 5169. 日期之间隔几天 Number of Days Between Two Dates
LeetCode contest 200 5475. 统计好三元组 Count Good Triplets
LeetCode contest 200 5475. 统计好三元组 Count Good Triplets
【1089】Insert or Merge (25 分)
先模拟直接插入排序的每一趟的过程,并进行判断每一趟的序列和给出的第二个序列是否相同,若不相同则一定是归并排序,直接对第一个序列进行归并排序一趟并输出。 (1)归并排序可以使用非递归版本(更少);
81 0
【1030】Travel Plan (30 分)
【1030】Travel Plan (30 分) 【1030】Travel Plan (30 分)
95 0
|
算法 JavaScript Java
并查集算法 - Algorithms, Part I, week 1 UNION-FIND
cousera 普林斯顿大学 算法公开课 第一周 并查集数据类型内容整理
1457 0

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19