【python-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] 重叠。

有了之前leetcode56的思路,这就简单了,直接先将要插入的区间加入到intervals中,后面代码都是一样的。

class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        res = []
        intervals.append(newInterval)
        intervals.sort()
        for i in intervals:
            if not res or res[-1][1]<i[0]:
                res.append(i)
            else:
                res[-1][1]=max(res[-1][1],i[1])
        return res

结果:

这是我第二次运行的结果,记一次时间消耗为156ms,击败7%,不知道它的运行机制是怎样的,还是根据自己电脑有关。

再仔细看下题目,说了intervals是按区间端点进行排序的,因此,可以利用二分查找法查找该区间插入的位置。

class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        if not intervals:
            return [newInterval]
        res = []
        ins = self.helper(intervals,newInterval[0])
        intervals.insert(ins,newInterval)
        for i in intervals:
            if not res or res[-1][1]<i[0]:
                res.append(i)
            else:
                res[-1][1]=max(res[-1][1],i[1])
        return res
    def helper(self,intervals,val):
        l=0
        r=len(intervals)-1
        if intervals[-1][0]<val:
            return r+1
        if intervals[0][0]>val:
            return l
        while l<r:
            mid=(l+r)//2
            if intervals[mid][0]>val:
                r=mid
            else:
                l=mid+1
        return l

结果:

注意要考虑特殊情况,当插入的区间端点大于被插入区间端点的最大值时,要返回len(intervals) ,即插入到被插入区间最后面。

原文地址:https://www.cnblogs.com/xiximayou/p/12347243.html

时间: 2024-10-12 03:17:53

【python-leetcode57-区间合并】插入区间的相关文章

求多个区间合并后区间大小的巧妙解决方法【差分】

上图一共有5个区间,分别是[0,2].[2,4].[8,11].[7,11].[15,18].如果要求这些区间合并后区间的大小,有两种简单的方法. 方法一:比较每两个区间的范围,如果两个区间有交集,则合并它们.最后所有区间会合并成几个离散的大区间,结果为这些区间大小之和.这种方法的时间复杂度是O(n^2). 方法二:使用一个可以覆盖所有区间范围的数组,对每个区间进行标记,结果为数组中被标记元素的个数.这种方法的时间复杂度是O(nm). 注:n是区间个数,m是所有区间总的范围. 如果n和m都比较大

尾递归做区间合并插入示例

有一区间列表ranges [[0, 2], [4, 6], [8, 10], [12, 14]],按序排列好了的,没有交集.现在有一新范围range_new [4, 9],进行合并. 采用递归思想,可以用range_new依次和ranges中的范围比较 如果range_new是子集,直接返回 如果range_new小于当前范围,左边直接插入 如果range_new大于当前范围,递归ranges右边的范围比较 如果range_new存在交集,求并集,删除当前范围,如果最大值变化,用并集递归rang

poj3667---Hotel 线段树区间合并,区间更新

题意:有N个房间,M次操作.有两种操作(1)"1 a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示入住.(2)"2 b len",把起点为b长度的len的房间清空,即退房.三个数组分别记录   lsum区间左值       rsum区间右值       sum区间最大值. 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <ct

【LeetCode-面试算法经典-Java实现】【057-Insert Interval(插入区间)】

[057-Insert Interval(插入区间)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 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 star

POJ - 3667 - Hotel (线段树 - 区间合并)

题目传送:Hotel 思路:线段树,区间合并,区间替换,查询最左断点,看胡浩版本的线段树好几天了,今天看这个看了好久,慢慢来吧,具体都写在注释里了 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #inc

POJ 3667 Hotel 【线段树 区间合并 + Lazy-tag】

Hotel Time Limit: 3000MS Memory Limit: 65536K 链接:POJ 3667   Description The cows are journeying north to ThunderBay in Canada to gain cultural enrichment and enjoy a vacation on the sunnyshores of Lake Superior. Bessie, ever the competent travel agen

HDU 2871 Memory Control(线段树&#183;区间合并&#183;Vector)

题意  模拟内存申请  有n个内存单元  有以下4种操作 Reset  将n个内存单元全部清空 New x  申请一个长度为x的连续内存块  申请成功就输出左端 Free x  将x所在的内存块空间释放  释放成功输出释放的内存始末位置 Get x  输出第x个内存块的起始位置 Reset 和 New 都是基本的区间合并知识  比较简单  Free和Get需要知道内层块的位置  所以我们在New的时候要将申请的内存块的始末位置都存起来  两个内层块不会相交  这样就能通过二分找到需要的内层块了

插入区间

给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]. 插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]. 1 /** 2 * Definition of Interval: 3 * public classs Interval { 4 * int star

【BZOJ】3065: 带插入区间K小值

题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175000) #include <bits/stdc++.h> using namespace std; const int nTr=1000005, nSg=15000005, alphaA=4, alphaB=5; int STop; struct Seg *Snull; struct Seg { Seg *l, *r; int s, cnt; }Sg[nSg], *iSg=Sg, *bin[nSg]