返回全部文章

二分查找:真正难的不是模板,而是边界和单调性

很多人学二分时,第一反应都是背模板。

很多人学二分时,第一反应都是背模板。

但二分真正难的地方,其实不在模板,而在两个问题:

  • 这题到底有没有单调性
  • 边界应该怎么定义

为什么很多人二分写不稳

因为只记了代码,没有先回答这两个前置问题。

结果就是:

  • 代码似乎很熟
  • 一换题目形式就不确定
  • 最后经常死在边界细节

二分真正依赖的是什么

不是“数组有序”这四个字,而是:

答案空间里存在单调变化。

比如:

  • 小于某个值时都不满足
  • 大于等于某个值后都满足

只要有这种结构,二分就有机会成立。

边界为什么这么关键

二分最容易出错的地方就是:

  • 区间是闭区间还是半开区间
  • 中点怎么取
  • 最终返回左边还是右边

这些问题如果没有统一约定,二分就会显得非常脆。

我更习惯的做法

先不写代码,先写清楚这三句:

  1. 我要找的是第一个满足条件的位置,还是最后一个满足条件的位置
  2. 判定函数是什么
  3. 判定函数是否单调

一旦这三句写清楚,代码反而不难了。

结论

二分查找真正的学习重点,不是背一个 while 模板,而是训练你判断:

这个问题里到底有没有单调性,以及我要找的边界到底是谁。