直接回答:边界混乱的根治方法是固定一种不变量写法:左闭右开 [lo, hi),循环条件 lo < hi,mid 命中判断后 hi = mid 或 lo = mid + 1,返回 lo——一套模板覆盖“找确切值、左边界、右边界、第一个满足条件的”全部变体。核心是永远保持“答案在 [lo, hi) 内”的不变量,不在循环里做 +1/-1 的即兴发挥。

展开解析:变体推导:找左边界(第一个 ≥ target)——a[mid] ≥ target 则 hi = mid(mid 可能是答案,不丢),否则 lo = mid + 1;找右边界(最后一个 ≤ target)转化为“第一个 > target 的位置减一”。mid 取整方向与区间收缩要配套——左闭右闭写法里 lo = mid + 1、hi = mid - 1 配合 (lo+hi)/2 下取整不会死循环,但 lo = mid 型收缩必须上取整 (lo+hi+1)/2,否则相邻两元素死循环,这是高频挂点。答案二分(二分答案/最小化最大值)识别特征:求“最小的 x 使某条件成立”或“最大的 x 使条件仍成立”,且条件关于 x 单调(满足后一直满足/不满足后一直不满足)——把判定函数 check(x) 写出来,对 x 二分。经典题单:吃香蕉的最小速度(Koko)、运送包裹的最小船载重、分割数组的最大值最小化、sqrt 与 pow 的精度二分(浮点二分循环 100 次代替 eps 判断更稳)。工程迁移:二分思想在排查问题同样锋利——git bisect、线上变更的批次二分定位,都是“单调判定加折半收敛”。验证纪律:写完二分用边界三件套自测——空区间、单元素、答案在两端。

追问方向:为什么 check 函数的单调性是答案二分的充要前提?旋转数组二分如何恢复单调性判断?

(约 490 字)