#704 二分查找
- 候选或优先级
- 有序数组中可能包含目标的下标区间。
- 收缩或淘汰
- 比较中点与目标,保留仍可能命中的一半。
- 结构不变量
- 若目标存在,其位置仍在候选区间内。
- 边界检查
- 空区间终止;闭区间和半开区间的更新规则不能混用。
Unit 00 · 前置知识、定义、边界契约与工作原理
这两类结构都在避免维护“全部答案细节”:二分依靠单调性压缩静态候选空间;堆依靠局部堆序维护动态候选边界。先理解它们保存什么信息、舍弃什么信息,再学习代码模板。
当前仍可能成为答案的位置、数值或对象。算法通过排除、保留或重组候选空间推进。
布尔结果沿候选顺序最多发生一次切换,如 False…False, True…True。这是二分答案的核心前提。
状态切换位置。常见目标包括第一个满足条件的位置、最后一个不超过目标的位置和插入点。
明确 left/right 是否属于候选、循环何时结束、每次更新排除了哪些位置。
把“答案是否足够大、速度是否够快”等复杂问题压缩为 True/False,供答案空间二分使用。
每轮前后始终成立的陈述,例如“答案仍在区间内”或“堆中保留当前最大的 K 个元素”。
除最后一层外全部填满,最后一层从左到右连续,因此可用数组无空洞表示。
只约束父子局部关系。最小堆保证父节点不大于孩子,但不保证数组整体有序。
抽象接口:插入、查看和弹出最高优先级项。堆是常用实现,但二者不是同一概念。
多路合并或图搜索中,只维护下一步可能被选中的少量对象,而不是一次展开全部数据。
大小为 K 的最小堆可保存当前最大的 K 项,堆顶是这 K 项中的最小边界。
优先级相同且对象不可比较时,使用整数序号组成 (priority, tie, item)。
二分、堆与优先队列:缩小搜索空间,用堆维护顺序与动态候选集合。
这里的梯度描述认知任务的递进,不等同于题库的难度标签。点击题目可进入对应单元。
用同一组问题定位每个单元,再观察迁移题改变了哪个条件。进入写代码环节后,学习地图会收起,留出独立思考的空间。
尚未开始具体算法;先识别候选空间能够被哪种证据压缩。
二分看“能否排除连续区间”,堆看“是否只需持续获得局部最高优先级”。
二分与堆都通过少维护信息提高效率:二分只维护仍可能包含答案的区间;堆只维护父子局部顺序和堆顶边界。选择结构前,先判断问题需要的是单调空间排除,还是动态优先候选。
完成不是“看过定义”,而是能把问题语言翻译成候选空间、状态判定和维护不变量。
本页完成后不会自动跳转。先停留检查自己的区间契约,再手动进入第一个正式二分页面。