zoukankan      html  css  js  c++  java
  • 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 
  • 相关阅读:
    CFS 调度器
    RCU
    linux cfs 负载均衡
    wait_event_interruptible_timeout
    算法(13)Contiguous Array
    算法(12)Pascal's Triangle II
    算法(12)Best Time to Buy and Sell Stock II
    算法(11)Find All Duplicates in an Array
    算法(10)Subarray Sum Equals K
    算法(9)Find the Duplicate Number
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/12940743.html
Copyright © 2011-2022 走看看