LeetCode #57 Insert Interval
题目
解题方法
插入问题首先考虑找到插入位置,对intervals[i][0]用二分查找即可,插入完成后记录下插入的位置,然后分别向两端找可以合并的区间。
向左边找时,如果intervals[i][1] >= intervals[insert_pos][0],意味着插入的区间的左端已经延伸到了此区间内部,可以进行合并,此时还要额外判断此区间的右端intervals[i][1]和插入区间右端的关系,防止此种情况出现:插入区间包含在此区间之内。合并完成后删除掉此区间,并修改insert_pos和i的值。如果intervals[i][1] < intervals[insert_pos][0],则说明已经不用再找了。
向右边找时,如果intervals[i][0] <= intervals[insert_pos][1],意味着插入区间的右端已经延伸到了此区间的内部,可以进行合并,选取两个区间右端的最大值作为新的右端,删除掉此区间即可,insert_pos和i都不要动。如果intervals[i][1] > intervals[insert_pos][0],则说明已经不用再找了。
代码
class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
if not intervals:
return [newInterval]
insert_pos = 0
left = 0
right = len(intervals) - 1
while left <= right:
mid = (left + right) // 2
if intervals[mid][0] == newInterval[0]:
intervals.insert(mid, newInterval)
insert_pos = mid
break
elif intervals[mid][0] < newInterval[0]:
left = mid + 1
else:
right = mid - 1
if left > right:
intervals.insert(left, newInterval)
insert_pos = left
i = insert_pos - 1
while i >= 0:
if intervals[i][1] >= intervals[insert_pos][0]:
intervals[insert_pos][0] = intervals[i][0]
intervals[insert_pos][1] = max(intervals[insert_pos][1], intervals[i][1])
intervals.pop(i)
insert_pos -= 1
i -= 1
else:
break
i = insert_pos + 1
while i < len(intervals):
if intervals[i][0] <= intervals[insert_pos][1]:
intervals[insert_pos][1] = max(intervals[insert_pos][1], intervals[i][1])
intervals.pop(i)
else:
break
return intervals