57.插入区间

题目:给你一个 无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

例子

1
2
3
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8][3,5],[6,7],[8,10] 重叠。

算法思想:

1.将newInterval根据第一个数值插入到intervals中的指定位置。
2.对于不存在合并的区间,直接插入到新的区间。
3.对于存在合并情况,可能是区间单端重合,或者是区间两端都包含,则在数组的迭代过程中,不断更新区间两端, 使其分别取最小值和最大值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from typing import List
class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
"""
算法思想
"""
if not intervals:
return [newInterval]
res = []
flag = False
# 将newInterval插入到合适的位置
for i in range(len(intervals)):
if newInterval[0] < intervals[i][0]:
intervals.insert(i, newInterval)
flag = True
break
# 追加到末尾
if not flag:
intervals.append(newInterval)
# 如果当前数组的第二个值比下一个数组的第一个值小, 或者取当前数组的第一个值比下一个数组的第二个值大,则不需要合并
for i in range(len(intervals) - 1):
if intervals[i][1] < intervals[i + 1][0] or intervals[i][0] > intervals[i + 1][0]:
res.append(intervals[i])
else:
# 存在需要合并的情况, 取当前数组的第一个值和下一个数组的第一个值的最小值和当前数组的第二个值和下一个数组的第二个值的最大值
# 分别作为新数组的第一个值和第二个值
intervals[i + 1] = [min(intervals[i][0], intervals[i + 1][0]), max(intervals[i][1], intervals[i + 1][1])]

return res + [intervals[-1]]


s = Solution()
res = s.insert([[3, 8], [9, 12], [14, 18], [21, 22]], [16, 21])

print(res)

[[3, 8], [9, 12], [14, 22]]