📅  最后修改于: 2023-12-03 15:39:51.681000             🧑  作者: Mango
本文将介绍如何向已排序且不重叠的区间数组中插入新的区间。
已知一个已排序且不重叠的区间数组 intervals
,其中每个区间为 [start, end]
的形式,现在需要将一个新的区间 [newStart, newEnd]
插入到该数组中,并要求插入后数组依然保持已排序且不重叠的状态。
我们可以分两步来解决该问题:
因为数组 intervals
已经是有序的且不重叠的,所以我们可以使用二分查找来找到需要插入的位置。具体地,我们可以在 intervals
中找到第一个起始位置 start
大于 newStart
的区间的下标 i
,此时我们可以将新区间插入到 i
的位置。
如果 newStart
大于数组中的所有区间的起始位置,则应将新区间插入到数组的末尾。如果 newStart
小于数组中的所有区间的起始位置,则应将新区间插入到数组的开头。
示例代码:
def get_insert_index(intervals, newStart):
n = len(intervals)
left, right = 0, n - 1
while left <= right:
mid = (left + right) // 2
if intervals[mid][0] >= newStart:
right = mid - 1
else:
left = mid + 1
return left
我们将新区间插入到数组中,并对数组进行遍历。对于相邻的两个区间 curr
和 next
,如果它们重叠了,则将它们合并为一个新的区间 [curr[0], max(curr[1], next[1])]
并继续向后遍历。
注意:这里假设区间 [start1, end1]
和区间 [start2, end2]
重叠等价于区间 (start1, end1]
和区间 [start2, end2]
重叠。也就是说,区间两端的点不属于区间本身。
示例代码:
def insert(intervals, newInterval):
res = []
n = len(intervals)
insert_index = get_insert_index(intervals, newInterval[0])
intervals.insert(insert_index, newInterval)
curr = intervals[0]
for i in range(1, n + 1):
if i == n or curr[1] < intervals[i][0]:
res.append(curr)
curr = intervals[i] if i < n else None
else:
curr[1] = max(curr[1], intervals[i][1])
return res
本文介绍了如何向已排序且不重叠的区间数组中插入新的区间,并要求插入后数组依然保持已排序且不重叠的状态。我们采用二分查找定位插入位置,并合并相邻重叠的区间。