1. 问题背景与核心思路
区间交集问题是算法面试中的经典题型,常见于各大公司的技术面试环节。给定两个由闭区间组成的列表,每个区间列表都是成对不相交的,并且已经按照区间起始点排序。我们需要找到这两个区间列表中所有具有交集的区间组合。
这个问题的实际应用场景非常广泛:
- 会议室预定系统的时间段冲突检测
- 日程安排中的空闲时间匹配
- 物流运输中的路线重叠计算
- 基因序列比对中的重叠区域识别
双指针法是解决这类有序区间问题的利器。它的核心优势在于能够利用数据已排序的特性,通过两个指针的协同移动,在O(m+n)的时间复杂度内解决问题,避免了暴力解法O(m*n)的时间开销。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法原理与关键步骤
2.1 双指针移动策略
我们维护两个指针i和j,分别指向两个区间列表的当前处理位置。在每一步迭代中,我们考虑A[i]和B[j]的相交情况:
- 如果A[i]和B[j]相交,记录这个交集
- 移动结束点较小的那个区间的指针(因为较大的区间可能还会与下一个区间相交)
这个策略之所以有效,是因为区间已经按起始点排序。当A[i]的结束点小于B[j]的结束点时,A[i]不可能再与B[j]之后的任何区间相交(因为后续区间的起始点只会更大),所以可以安全地移动i指针。
2.2 区间相交的判断条件
两个区间[a1, a2]和[b1, b2]存在交集的条件是:
max(a1, b1) <= min(a2, b2)
交集的区间就是:
[max(a1, b1), min(a2, b2)]
这个数学表达简洁地捕捉了区间重叠的本质:当两个区间的"最晚开始"早于"最早结束"时,它们必然有重叠部分。
3. 代码实现与详细解析
python复制def intervalIntersection(A, B):
i = j = 0
result = []
while i < len(A) and j < len(B):
# 确定两个区间的起始和结束
a_start, a_end = A[i]
b_start, b_end = B[j]
# 检查是否有交集
low = max(a_start, b_start)
