Master LeetCode 986: Interval List Intersections with Efficient Double Pointer Technique - Solve Scheduling Conflicts Easily
1.1 场景设定:一个调度工程师的混乱周一
周一清晨,我的咖啡还没喝完,会议室预订系统的警告就弹满了屏幕。市场部的周会申请了10点-11点的A会议室,研发团队却坚持他们的原型评审要占用10:30-12点——又是该死的重叠时段!转头看设备调度表更头疼:测试机003被两个项目组同时抢订在下午2点到4点之间。这些红蓝交错的碰撞色块,像极了上周五遗留在我桌上的优盘里,那道叫LeetCode 986的魔鬼题目。现实中的资源争夺战,原来就是时间区间的重叠战争。
这不只是日历格子的小冲突。当无人机配送时段和空中管制窗口撞车,当数据中心备份任务挤爆同一时段——作为调度工程师,我必须在这些碎片化的时间缝隙里精准抠出共享空间。那些重叠的彩色时间条,每一段都代表着资源、金钱甚至安全。
1.2 LeetCode 986的正式挑战状
现在让我们摊开这张挑战状:Interval List Intersections。核心问题很直白——扔给我两个列表,每个列表装着一堆闭区间[start,end]。任务就是揪出所有时间重叠的片段。听起来像小学生拼积木?别急,魔鬼藏在细节里。
输入样例像两列静默的士兵:
firstList = [[0,2],[5,10]]
secondList = [[1,5],[8,12]]
我的眼睛迅速扫描这些数字。第一组的[0,2]和第二组的[1,5]在哪儿碰头?[5,10]和[8,12]又在何时握手?大脑自动开始画时间轴——这正是工程师的本能:把抽象数字还原成真实的时间战场。
1.3 输入输出示例可视化
打开我的终端仿真器,敲入那两组区间数据。屏幕左侧唰地落下红色时间条:
[0,2] |====|
[5,10] |=========|
右侧弹出蓝色时间条:
[1,5] |=====|
[8,12] |=======|
当红色和蓝色的条带开始流动,碰撞的火花在max(0,1)=1和min(2,5)=2之间迸发——第一条紫色重叠带[1,2]诞生了!紧接着在max(5,8)=8和min(10,12)=10处,第二条紫色带[8,10]破土而出。
输出列表[[1,2],[8,10]]在屏幕上跳动。这不正是会议室冲突的数学化身吗?那道横跨虚拟与现实的986号问题,此刻正式揭开面纱。
2.1 直觉诞生:暴力遍历的黄昏时刻
盯着会议室冲突表里密密麻麻的时段,我第一反应是穷举匹配——把红色时间条和蓝色时间条两两配对检查。但想象一下:当市场部提交50个时段申请,研发团队又有60个时段需求,我的系统要执行3000次比对!这种O(m*n)的暴力解法就像让调度员手动翻遍所有纸质日程本,咖啡凉了都算不出结果。
现实场景更残酷。航空管制系统处理着数万条飞行区间,数据中心调度着百万级任务时段。暴力遍历在测试环境可能苟活,到生产环境直接崩成雪花屏。我们需要的是能在时间洪流中精准捕捞的智能渔网,而不是耗尽资源的蛮力拖网。
2.2 “守望指针”的双人芭蕾
灵光闪现于钢琴师的双手——左手弹奏firstList的音符,右手抚过secondList的琴键。两个指针就是我的左右手食指:i指针扫描红色会议室时段,j指针追踪蓝色设备占用。它们不是独立乱窜,而是跳着优雅的协同步伐。
指针初始位置都在零坐标。当红色[0,2]遇见蓝色[1,5]时,我的两只食指同步悬停在碰撞点上。没有重复扫描,没有回溯浪费,这对指针像磁悬浮列车在两条轨道上滑行。守望指针的精髓在于:它们永远只朝未来前进,把过时区间抛在身后。
2.3 时空重叠的黄金法则
发现重叠的秘密藏在四维夹缝里:取两组区间起点的最大值,再取终点的最小值——当max(startA, startB) <= min(endA, endB)成立时,紫色火花必然迸发!比如红色[5,10]和蓝色[8,12]交锋时,max(5,8)=8与min(10,12)=10构建出[8,10]的共享时空。
指针推进遵循自然法则:谁的终点更早谁就让位。蓝色[1,5]结束在5时刻?j指针立即右移查看下个蓝色区间。红色[5,10]坚持到10时刻?那就让i指针向前跃进。这个"谁先结束谁离场"的规则,确保了每次移动都吃掉最小的时间切片,绝不回头。
2.4 纸上演算:双指针的实战探戈
取出新案例验证:红: [[1,3],[5,9]] VS 蓝: [[2,5],[7,10]]。初始i=0指向[1,3],j=0指向[2,5]:
- 碰撞检测:max(1,2)=2 <= min(3,5)=3 → 捕获[2,3]
- 推进决策:红区间3结束<蓝区间5结束 → i跳到[5,9]
第二轮i=1指向[5,9],j=0指向[2,5]:
- 碰撞检测:max(5,2)=5 <= min(9,5)=5 → 捕获[5,5](瞬间重叠!)
- 推进决策:蓝区间5结束=红区间5结束 → 双指针齐进
最终轮i=1指向[5,9],j=1指向[7,10]:
- max(5,7)=7 <= min(9,10)=9 → 捕获[7,9]
- 红区间9结束<蓝区间10结束 → i指针触顶结束
输出[[2,3],[5,5],[7,9]]在纸面浮现。指针像两名探戈舞者,在时间线上精准踩点,从不踏错半步。
def intervalIntersection(firstList, secondList):
i, j = 0, 0
intersections = []
while i < len(firstList) and j < len(secondList):
low = max(firstList[i][0], secondList[j][0])
high = min(firstList[i][1], secondList[j][1])
if low <= high:
intersections.append([low, high])
if firstList[i][1] < secondList[j][1]:
i += 1
else:
j += 1
return intersections
def buggy_intersection(firstList, secondList):
i, j = 0, 0
res = []
while i < len(firstList) and j < len(secondList):
start = max(firstList[i][0], secondList[j][0])
end = min(firstList[i][1], secondList[j][1])
if start <= end:
res.append([start, end])
if firstList[i][1] < secondList[j][1]:
i += 1
return res
Effortlessly Handle Ultra-Long Sequences with Megalodon Transformer for Superior AI Efficiency
Master MySQL Update or Insert: Solve Data Conflicts and Boost Database Efficiency
Master udcli: Effortless Binary Disassembly and Reverse Engineering Guide for Developers
wwe-rss: Effortlessly Generate RSS Feeds and Master Your Information Flow with One Click
How to Check TLS Version in Linux: Secure Your Servers Easily and Avoid Security Risks
解决mongooseserverselectionerror: connect econnrefused ::1:27017错误的方法
Best Trick Techniques for Beginners: A Comprehensive Guide to Mastering Your Skills
Optimize Circuit Timing with RC Tree: Essential Techniques to Reduce Delays and Boost Performance