0986. 区间列表的交集
大约 2 分钟
--- 
0986. 区间列表的交集
- 标签:数组、双指针、扫描线
- 难度:中等
题目链接
题目大意
描述:
给定两个由一些「闭区间」组成的列表, 和 ,其中 而 。每个区间列表都是成对「不相交」的,并且「已经排序」。
要求:
返回这 两个区间列表的交集 。
说明:
- 形式上,闭区间 (其中 )表示实数 的集合,而 。
- 两个闭区间的「交集」是一组实数,要么为空集,要么为闭区间。例如, 和 的交集为 。
- 。
- 。
- 。
- 。
- 。
- 。
示例:
- 示例 1:

输入:firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]]
输出:[[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]- 示例 2:
输入:firstList = [[1,3],[5,9]], secondList = []
输出:[]解题思路
思路 1:双指针
思路
这道题要求找到两个区间列表的交集。我们可以使用双指针分别遍历两个列表:
- 初始化两个指针 和 ,分别指向 和 的起始位置。
- 对于当前的两个区间 和 :
- 计算交集:。
- 如果交集有效(即 ),将其加入结果。
- 移动指针:如果 ,说明第一个区间已经处理完,移动 ;否则移动 。
- 返回所有交集区间。
代码
class Solution:
def intervalIntersection(self, firstList: List[List[int]], secondList: List[List[int]]) -> List[List[int]]:
res = []
i, j = 0, 0
# 双指针遍历两个列表
while i < len(firstList) and j < len(secondList):
start1, end1 = firstList[i]
start2, end2 = secondList[j]
# 计算交集
start = max(start1, start2)
end = min(end1, end2)
# 如果交集有效,加入结果
if start <= end:
res.append([start, end])
# 移动指针:结束时间较早的区间已经处理完
if end1 < end2:
i += 1
else:
j += 1
return res复杂度分析
- 时间复杂度:,其中 和 分别是两个列表的长度。每个区间最多被访问一次。
- 空间复杂度:,不考虑结果数组的空间,只使用了常数个额外变量。