Ex.2: Insert Intervals
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.
version 1:
def insert(intervals, newInterval):
merged = []
for i in intervals:
if newInterval is None or i[1] < newInterval[0]:
merged += i,
elif i[0] > newInterval[1]:
merged += newInterval,
merged += i,
newInterval = None
else:
newInterval[0] = min(newInterval[0], i[0])
newInterval[1] = max(newInterval[1], i[1])
if newInterval is not None:
merged += newInterval,
return merged
intervals = [[1,2],[3,4],[6,7],[7,8]]
newInterval = [8,9]
insert(intervals, newInterval)
in place:
def insert(intervals, newInterval):
for i in range(len(intervals)):
# 根据左区间找到对应插入位置
if intervals[i][0] > newInterval[0]:
# 判断新区间与左侧区间的关系
# 相离
if intervals[i-1][1] < newInterval[0]:
intervals.insert(i, newInterval)
i = i + 1
# 相交
else:
# 相交不包含
if intervals[i-1][1] < newInterval[1]:
intervals[i-1][1] = newInterval[1]
# 包含不需要任何操作
# 判断新区间与插入位置右侧区间的情况
# 相交则完成合并
if intervals[i][0] <= newInterval[1]:
intervals[i-1][1] = intervals[i][1]
intervals.remove(intervals[i])
# 插入操作完成后,推出循环
break
# 如果插入的位置在最右侧
if i == len(intervals) - 1:
# 判断最后一个区间与新区间的关系
# 相离
if intervals[i][1] < newInterval[0]:
intervals.append(newInterval)
else:
intervals[i][1] = newInterval[1]
return intervals
intervals = [[1,2],[3,4],[6,7],[7,8]]
newInterval = [8,9]
insert(intervals, newInterval)