题目描述
思路解析动画文字版
三个动作循环套:① 左端点够得着的区间进堆 ② 右端点盖不住的区间出堆 ③ 堆顶就是答案。查询从小到大,区间只进不退,所以每个区间最多进堆出堆一次。
准备阶段:区间已按左端点从小到大排好,每格里的数字是这个区间的长度。指针 p 指向下一个待入堆的区间,堆现在是空的。
轮到查询 q=2。先看哪些区间的左端点已经够得着它、要进堆,再把盖不住它的弹出去,最后读堆顶。
查询 q=2:区间 [1,3] 的左端点 1 不超过 2,左边已经够得着,把它(长度 3)推进堆。
查询 q=2:区间 [2,8] 的左端点 2 不超过 2,左边已经够得着,把它(长度 7)推进堆。
查询 q=2:指针 p 停在区间 [3,5],它的左端点 3 比 2 还大,左边都够不着 2,这一轮先不推它,等更大的查询再说。
查询 q=2:堆里剩下的区间都真包含 2,其中最短的是 [1,3](长度 3)——标红的就是它,于是 q=2 的答案记为 3。
轮到查询 q=4。先看哪些区间的左端点已经够得着它、要进堆,再把盖不住它的弹出去,最后读堆顶。
查询 q=4:区间 [3,5] 的左端点 3 不超过 4,左边已经够得着,把它(长度 3)推进堆。
查询 q=4:指针 p 停在区间 [6,9],它的左端点 6 比 4 还大,左边都够不着 4,这一轮先不推它,等更大的查询再说。
查询 q=4:[1,3] 的右端点已经小于 4,再也盖不住这个点了,从堆里弹掉。
查询 q=4:堆里剩下的区间都真包含 4,其中最短的是 [3,5](长度 3)——标红的就是它,于是 q=4 的答案记为 3。
轮到查询 q=7。先看哪些区间的左端点已经够得着它、要进堆,再把盖不住它的弹出去,最后读堆顶。
查询 q=7:区间 [6,9] 的左端点 6 不超过 7,左边已经够得着,把它(长度 4)推进堆。
查询 q=7:区间 [7,7] 的左端点 7 不超过 7,左边已经够得着,把它(长度 1)推进堆。
查询 q=7:指针 p 已经把所有区间都看过了,没有新的区间能进堆,直接进入下一步。
查询 q=7:[3,5] 的右端点已经小于 7,再也盖不住这个点了,从堆里弹掉。
查询 q=7:堆里剩下的区间都真包含 7,其中最短的是 [7,7](长度 1)——标红的就是它,于是 q=7 的答案记为 1。
轮到查询 q=9。先看哪些区间的左端点已经够得着它、要进堆,再把盖不住它的弹出去,最后读堆顶。
查询 q=9:指针 p 已经把所有区间都看过了,没有新的区间能进堆,直接进入下一步。
查询 q=9:[2,8]、[7,7] 的右端点已经小于 9,再也盖不住这个点了,从堆里弹掉。
查询 q=9:堆里剩下的区间都真包含 9,其中最短的是 [6,9](长度 4)——标红的就是它,于是 q=9 的答案记为 4。
四个查询从小到大依次扫完,每个查询都在「进堆、出堆、读堆顶」三步里拿到了自己的最短区间长度,最终答案是 [3,3,1,4]。
三个高频追问:堆里存什么、区间为何只进出一次、空堆边界。
参考代码
import heapqdef minInterval(intervals, queries): intervals.sort() # 按左端点排序 heap, ans, p = [], {}, 0 for q in sorted(queries): # 查询从小到大 while p < len(intervals) and intervals[p][0] <= q: l, r = intervals[p] heapq.heappush(heap, (r - l + 1, r)) # (长度, 右端) p += 1 while heap and heap[0][1] < q: # 弹掉盖不住的 heapq.heappop(heap) ans[q] = heap[0][0] if heap else -1 # 堆顶最短 return [ans[q] for q in queries]复杂度
- 时间:O((n+q)·log n),区间和查询各排序 O(n log n + q log q);每个区间最多进堆出堆一次,堆操作各 O(log n)
- 空间:O(n+q),堆最多装下全部区间 O(n),再加保存查询顺序与答案 O(q)
易错点
面试追问把动画讲成自己的话
追问堆里到底存什么?为什么按长度排序?
追问一个区间会被反复进堆出堆吗?
追问如果某查询没有任何区间包含它,怎么处理?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。再去主线里挑下一道练手。
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题