二分查找:真正难的不是模板,而是边界和单调性
很多人学二分时,第一反应都是背模板。
很多人学二分时,第一反应都是背模板。
但二分真正难的地方,其实不在模板,而在两个问题:
- 这题到底有没有单调性
- 边界应该怎么定义
为什么很多人二分写不稳
因为只记了代码,没有先回答这两个前置问题。
结果就是:
- 代码似乎很熟
- 一换题目形式就不确定
- 最后经常死在边界细节
二分真正依赖的是什么
不是“数组有序”这四个字,而是:
答案空间里存在单调变化。
比如:
- 小于某个值时都不满足
- 大于等于某个值后都满足
只要有这种结构,二分就有机会成立。
边界为什么这么关键
二分最容易出错的地方就是:
- 区间是闭区间还是半开区间
- 中点怎么取
- 最终返回左边还是右边
这些问题如果没有统一约定,二分就会显得非常脆。
我更习惯的做法
先不写代码,先写清楚这三句:
- 我要找的是第一个满足条件的位置,还是最后一个满足条件的位置
- 判定函数是什么
- 判定函数是否单调
一旦这三句写清楚,代码反而不难了。
结论
二分查找真正的学习重点,不是背一个 while 模板,而是训练你判断:
这个问题里到底有没有单调性,以及我要找的边界到底是谁。