30. 插入区间

30. 插入区间

中文English

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

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

样例

样例 1:

输入:
(2, 5) into [(1,2), (5,9)]
输出:
[(1,9)]

样例 2:

输入:
(3, 4) into [(1,2), (5,9)]
输出:
[(1,2), (3,4), (5,9)]
输入测试数据 (每行一个参数)如何理解测试数据?
第一个版本:
##插入区间
class Solution:
    '''
    大致思路:
    1.左右可以合上,说明是一个完整的区间,=0进行判断是否区间合并
    '''
    def insert(self, intervals, newInterval):
        intervals.append(newInterval)
        l = []
        for c in intervals:
            l.append([c[0],-1])
            l.append([c[1],1])
        
        l.sort()
        l.append([None,None])
        #如果刚好等于0,则区间是完整的区间,格式[[1,-1],[2,1],[5,-1],[8,1],[6,-1],[10,1]] >> [[1, -1], [2, 1], [5, -1], [6, -1], [8, 1], [10, 1]]
        num = 0
        res = []
        left,right = l[0][0],0
        for z in range(len(l)):
            if l[z][0] == None:
                break
            num += l[z][1]
            if num == 0:
                res.append([left,right])
                left = l[z+1][0]
            else:
                right = l[z+1][0]                 
        return res
#result = Solution().insert([(1,3), (5,9)],(4, 6))
#print(result)

第二个版本:

##合并区间
class Solution:
    '''
    大致思路:
    初始化left = newinterval.start,right  =newinterval.end
    1.当插入的区间不关联的情况:interval.end < newinterval.start  或者 interval.start > newinterval.end 
    如果是interval.end < newinterval.start 的时候,说明当前需要插入的位置需要+1
    2.如果是相关联的话,则不是以上两种情况,则此时需要取出left = min(interval.strat,left),right = max(interval.end,right) 
    3.最终插入result.insert(位置,(left,right)),返回
    '''
    def insert(self, intervals, newInterval):
        left,right = newInterval[0],newInterval[1]
        insertIndex = 0
        result = []
        for interval in intervals:
            #不关联
            if interval[1] < newInterval[0]:
                insertIndex += 1
                result.append(interval)
            elif interval[0] > newInterval[1]:
                result.append(interval)
            else:
                left = min(left,interval[0])
                right = max(right,interval[1])
        result.insert(insertIndex,(left,right))
        return result

result = Solution().insert([(1,3), (5,9)],(2, 6))
print(result)
        

lintcode版本:(原理同第二个版本)

"""
Definition of Interval.
class Interval(object):
    def __init__(self, start, end):
        self.start = start
        self.end = end
"""

class Solution:
    """
    @param intervals: Sorted interval list.
    @param newInterval: new interval.
    @return: A new interval list.
    """

    def insert(self, intervals, newInterval):
        # write your code here
        insert_index = 0
        res = []
        for interval in intervals:
            if interval.end < newInterval.start:
                insert_index += 1  
                res.append(interval)
            elif interval.start > newInterval.end:
                res.append(interval)
            else:
                newInterval.start = min(newInterval.start,interval.start)
                newInterval.end = max(newInterval.end,interval.end)
        res.insert(insert_index,newInterval)
        return res 
原文地址:https://www.cnblogs.com/yunxintryyoubest/p/12940743.html