题目:
给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals
,其中 intervals[i] = [starti, endi]
表示第 i
个区间的开始和结束,并且 intervals
按照 starti
升序排列。同样给定一个区间 newInterval = [start, end]
表示另一个区间的开始和结束。
在 intervals
中插入区间 newInterval
,使得 intervals
依然按照 starti
升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。
返回插入之后的 intervals
。
注意 你不需要原地修改 intervals
。你可以创建一个新数组然后返回它。
题目示例:
示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 2:
输入: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] 重叠。
代码:
class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
result=[]
count=0
if not intervals:
result.append(newInterval)
return result
for content in intervals:
if content[1]<newInterval[0]:#小于左边界
result.append(content)
elif content[0]>newInterval[1]:#大于右边界
if not result or result[-1][1]<newInterval[0]: #当大于的时候,检查是否插入
result.append(newInterval)
result.append(content)
elif newInterval[0]<=content[1] and count==0: #当不满足上面两种情况时,说明在区间内部,且没有插入时,进入代码块,结果增加
result.append(content)
result[-1][0]=min(content[0],newInterval[0])
result[-1][1]=max(content[1],newInterval[1])
count=1
elif newInterval[0]<=content[1] and count==1: #已插入时,持续更新右端点
result[-1][1]=max(content[1],newInterval[1])
if newInterval[0]>result[-1][1]:#最终没有插入
result.append(newInterval)
return result
代码思路:
代码逻辑:
result结果列表,重点在第二点在区间时怎么处理
我采用的时,当没有放入结果列表时,取并集,然后放入之后,如果还在区间内部的话,持续更新右端点。
时间复杂度:O(n),其中 n 是数组 intervals 的长度,即给定的区间个数。
空间复杂度:O(1)。除了存储返回答案的空间以外,我们只需要额外的常数空间即可。