二分的边界
约 10 分钟
二分最容易出错的就是边界细节:循环条件写 lo <= hi 还是 lo < hi,指针该更新成 mid 还是 mid+1、mid-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 个元素的数组试。
登录 后可看答案