开始前应具备
- 能解释循环不变量
- 熟悉整数除法和数组边界
- 理解单调递增与单调判定
CHAPTER 04 · 单调决策
不只在数组里找数,更要学会在满足单调性的答案空间中做决策。
BEFORE LEARNING
二分的核心不是“数组有序”,而是答案空间存在真假分界。稳定掌握一种区间定义后,就能把查找、边界和最优化问题统一起来。
开始前应具备
完成本章后
CORE LESSONS
LESSON
在有序数组中寻找一个确定目标值。
闭区间 [left, right] 表示答案仍可能存在的位置。比较 mid 后,被排除的一半必须明确不含目标,因此更新为 mid ± 1。
left, right = 0, n - 1
while left <= right:
mid = left + (right - left) // 2
if a[mid] == target: return mid
if a[mid] < target: left = mid + 1
else: right = mid - 1LESSON
目标可能重复,需要第一个或最后一个位置;或数组由若干有序段组成。
找到目标后不能立即返回,而要记录候选并继续向目标边界压缩。旋转数组则先判断哪一半有序,再判断目标是否落在该半区。
answer = -1
while left <= right:
mid = ...
if is_valid(mid):
answer = mid
right = mid - 1 # 继续找左边界
else: left = mid + 1LESSON
要求最小化最大值、最大化最小值,并且给定候选答案后容易判断是否可行。
先确定答案上下界,再设计单调判定函数 feasible(x)。当 x 越大越容易满足或越难满足时,真假分界就是需要寻找的最优答案。
left, right = min_answer, max_answer
while left < right:
mid = (left + right) // 2
if feasible(mid): right = mid
else: left = mid + 1
return leftREADING
先读完本站讲义并尝试练习;遇到推导不清的地方,再回到原始教程深入阅读。
PRACTICE LADDER
题量由知识点决定,不再固定为 5 道。先完成“入门”和“模板”,再做变式与综合;挑战题可以留到复习阶段。
1 道 · 依次完成
Binary Search
为什么选:固定闭区间二分模板。
4 道 · 依次完成
Search Insert Position
为什么选:理解循环结束后的插入边界。
Find First and Last Position
为什么选:分别寻找左边界和右边界。
Find Minimum
为什么选:从旋转数组中识别有序关系。
Search Rotated Array
为什么选:先判断有序半边,再判断目标所在区间。
1 道 · 依次完成
Koko Eating Bananas
为什么选:把速度作为答案并设计单调可行性判断。
PERSONAL NOTEBOOK
笔记保存在当前浏览器