Skip to content

二分查找变体(旋转数组 / 二分答案 / 三分)

二分查找(Binary Search)的强大不在于「查有序数组」这一个场景,而在于它是一种思想:只要某个判定关于某个变量是单调的(变量越大判定越往一个方向走),就能对这个变量二分。本叶聚焦二分的三大进阶变体——①旋转排序数组搜索:数组虽整体被旋转,但拆成两段后各自仍有序,于是「判断 mid 落在哪段、哪半边有序」后仍能折半,O(log n) 搜到目标;②二分答案:把对下标的二分换成对答案值域的二分,每次取一个候选答案 mid 调用 check(mid) 验证可行性,靠「可行性关于答案单调」把「最优解」问题降成 log 次判定;③三分法(Ternary Search):当目标函数是单峰/单谷(凸/凹)时,取两个内分点 m1 < m2 比较函数值,每次能排除三分之一的区间,O(log n)(底数为 1.5)逼近极值。

三者共性:广义单调性是二分的根基——旋转数组靠「部分有序」保证每轮能排除一半,二分答案靠「可行性单调」保证能折半值域,三分靠「凸性」保证能排除一侧。掌握这三变体,二分就从「模板题」升级为「能解决一大类最优化与搜索问题的通用武器」。

评价

优点

  • O(log n) 的高效:三种变体都把线性甚至多项式的搜索/优化压到对数级——旋转数组搜索从 O(n) 降到 O(log n),二分答案把「在值域 V 上求最优」降到 O(log V × check),三分把求单峰极值降到 O(log n)
  • 适用面极广:旋转数组覆盖「部分有序」场景;二分答案是「最大化最小值 / 最小化最大值 / 第 k 小」类题的通用框架;三分覆盖凸函数求极值(如几何最短距离、某些 DP 优化)
  • 思想可迁移:理解了「单调性 ⇒ 可二分」,就能在更多地方识别二分(如二分图匹配、网络流二分、浮点二分),是一类算法的「元思想」

缺点

  • 边界极易写错:旋转数组的分支判断(哪半有序、目标在不在这半)繁杂;二分答案的 check 设计与 mid 取整(下取整还是上取整、开闭区间)影响正确性;三分的精度/终止条件在浮点场景容易出错
  • 退化风险:旋转数组含重复元素时,nums[mid] == nums[lo] 无法判断哪半有序,最坏退化到 O(n);二分答案要求「可行性单调」,若不单调则整套失效
  • 三分有前提:只对严格凸/凹函数成立,多峰或非凸函数三分会收敛到局部而非全局极值

本叶地图

  • 入门 —— 二分的广义化(单调性即可二分)、三变体速览、共性「广义单调」、与朴素二分的区别
  • 旋转数组搜索 —— 旋转数组两段各自有序、判断 mid 在左段/右段再定哪半有序、找旋转点(最小值)、含重复元素退化 O(n)
  • 二分答案与三分法 —— 二分答案思想(对值域二分 + check 验证)、适用条件(答案单调可验证)、经典题、三分法(单峰函数 m1/m2 比较缩区间)
  • 参考 —— 三变体复杂度表、搜索/答案/三分代码模板、适用场景对比、易错点

交互演示

幻灯片地址

二分查找变体

测试题

二分查找变体测试题