二分的边界

10 分钟

二分最容易出错的就是边界细节:循环条件写 lo <= hi 还是 lo < hi,指针该更新成 mid 还是 mid+1mid-1。差一步就可能死循环,或漏掉正确答案。建议记牢一套自己写熟、验证过的写法,别每次临时拼。

#include <iostream>
using namespace std;
int main() {
    int a[2] = {3, 7}, n = 2, target = 7;
    int lo = 0, hi = n - 1, pos = -1;
    while (lo <= hi) {                       // 用 <= ,配合 mid±1
        int mid = (lo + hi) / 2;
        if (a[mid] == target) { pos = mid; break; }
        else if (a[mid] < target) lo = mid + 1;   // 一定要 +1
        else hi = mid - 1;
    }
    cout << pos;                             // 1
}

比如把 lo = mid + 1 写成 lo = mid,当区间只剩一个元素时 mid 不动,就会卡死循环。写完二分,先拿只有 1 个和 2 个元素的数组各跑一遍。

小纸条

写完二分,先拿只有 1 个和 2 个元素的数组试。

登录 后可看答案

二分的边界 · C++ 入门 · op599 课程