-
一. 二分查找的基本逻辑
二分查找的核心思想是通过不断缩小搜索范围来找到目标值。通常有两种实现方式:
左闭右闭区间:[l, r]。
左闭右开区间:[l, r)。 -
二.while(l<r)和while(r-l>1)
- while (r - l > 1) 的作用
含义:当 l 和 r 相邻时(即 r - l = 1),退出循环。
目的:确保在退出循环时,l 和 r 是两个相邻的值,便于后续处理。
使用 while (r - l > 1) 可以确保在退出循环时,l 和 r 是两个可能的值,便于找到最小的满足条件的 x。
2.while (l < r) 的作用
含义:当 l 和 r 重合时(即 l = r),退出循环。
目的:确保在退出循环时,l 和 r 指向同一个值。
整数二分模版:
bool check(int x) {/* ... */} // 检查x是否满足某种性质
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{while (l < r){int mid = l + r >> 1;//用来寻找满足条件的最小值if (check(mid)) r = mid; // check()判断mid是否满足性质else l = mid + 1;}return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{while (l < r){int mid = l + r + 1 >> 1;//用来寻找满足条件的最大值if (check(mid)) l = mid;else r = mid - 1;}return l;
}
浮点数二分模板:
bool check(double x) {/* ... */} // 检查x是否满足某种性质double bsearch_3(double l, double r)
{const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求while (r - l > eps){double mid = (l + r) / 2;if (check(mid)) r = mid;else l = mid;}return l;
}