开始前应具备
- 完成前九章核心题
- 能独立分析复杂度
- 理解堆与哈希表的基本操作
CHAPTER 10 · 综合进阶
组合多个基础模型,训练局部决策、优先级维护和数据结构设计。
BEFORE LEARNING
进阶题往往不是新语法,而是把排序、哈希、链表和优先队列组合起来满足特定复杂度约束。
开始前应具备
完成本章后
CORE LESSONS
LESSON
每一步只需做局部选择,且能证明替换成该选择不会让最终答案更差。
贪心不是“选眼前最好”这么简单。排序通常用来建立选择顺序,交换论证则说明任意最优解都能转换成包含当前贪心选择的解。
sort(candidates, by=greedy_key)
state = initial
for candidate in candidates:
if feasible(candidate, state): take(candidate); update(state)LESSON
只关心最大/最小的若干元素,或数据持续到来且需要快速取得当前极值。
固定大小的堆只维护与答案相关的 K 个候选,无需完整排序。两个堆还能把数据分成较小的一半和较大的一半,实时维护中位数。
heap = []
for item in stream:
push(heap, item)
if len(heap) > k: pop_top(heap)
return heapLESSON
题目定义多个 API,并明确 get、put、删除或随机访问的目标复杂度。
单个结构往往不能同时满足所有操作。LRU 用哈希表 O(1) 定位节点,用双向链表 O(1) 调整最近使用顺序;两者通过同一个节点对象保持一致。
get(key): locate in map → move node to recent end
put(key, value): update or insert → evict oldest if fullREADING
先读完本站讲义并尝试练习;遇到推导不清的地方,再回到原始教程深入阅读。
PRACTICE LADDER
题量由知识点决定,不再固定为 5 道。先完成“入门”和“模板”,再做变式与综合;挑战题可以留到复习阶段。
3 道 · 依次完成
Assign Cookies
为什么选:排序后用最小可满足资源完成局部匹配。
Jump Game
为什么选:扫描中维护当前能到达的最远边界。
Merge Intervals
为什么选:排序后合并与当前区间相交的候选。
3 道 · 依次完成
Top K Frequent Elements
为什么选:哈希统计频率,再用大小为 K 的堆筛选。
Kth Largest Element
为什么选:比较堆与快速选择的不同复杂度和使用场景。
Find Median from Data Stream
为什么选:用两个堆持续维护有序数据的中间分界。
1 道 · 依次完成
LRU Cache
为什么选:组合哈希表和双向链表满足两个 O(1) API。
PERSONAL NOTEBOOK
笔记保存在当前浏览器