LeetCode 986中等区间 · 双指针
区间列表的交集 图解题解
这道题到底在问什么
给两个已排序、互不重叠的区间列表,返回它们的所有交集。
- 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]]
最优解:一步一步想明白
⚠️ 容易写错的地方
✗ 错:交集条件写成 left < right
✓ 对:应写 left <= right
端点相等是单点交集
✗ 错:移动开始更小的一边
✓ 对:移动结束更早的一边
决定区间是否用完的是右端点
完整代码(Python)
Python
class Solution:
def intervalIntersection(self, firstList, secondList):
i = j = 0
ans = []
while i < len(firstList) and j < len(secondList):
a1, a2 = firstList[i]
b1, b2 = secondList[j]
left = max(a1, b1)
right = min(a2, b2)
if left <= right:
ans.append([left, right])
if a2 < b2:
i += 1
else:
j += 1
return ans套路模板 · 两区间列表扫描
class Solution:
def scanIntervals(self, a, b):
i = j = 0
ans = []
while i < len(a) and j < len(b):
left = max(a[i][0], b[j][0])
right = min(a[i][1], b[j][1])
if left <= right:
ans.append([left, right])
if a[i][1] < b[j][1]:
i += 1
else:
j += 1
return ans复杂度
时间复杂度
O(m+n)
每次移动一个指针
空间复杂度
O(1)
不计返回结果
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 区间列表的交集 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
这道题为什么用「双指针」,换最直接的暴力解会差在哪?+
双指针抓住了本题的结构特征,把暴力解里重复的工作省掉;暴力解通常要多嵌套一层枚举,数据一大就超时。具体对比见上文「暴力解及其卡点」与「最优解逐步推演」两节。
时间复杂度为什么是 undefined?怎么推出来的?+
按上文复杂度小节的推导,时间复杂度为 undefined。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。