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