本文最后更新于27 天前,其中的信息可能已经过时,如有错误请发送邮件到3467842596@qq.com
AI智能摘要
二分查找算法是一种高效的排序和搜索技术,常用于快速找到特定值在已排序数组中的位置。文章介绍了两种版本的二分查找板子:一种是左开右闭区间形式的模板,另一种是浮点数的二分查找。视频链接提供了如何避免死循环的技巧,帮助理解并正确使用这些板子。
注意:为了归纳分类,有些文章的标题中带小括号,小括号里的内容对应于OI Wiki网站中的目录:oi-wiki.org(若小括号中有大于号">",则表示此文章的内容处于">"后面的子目录中,或者子目录的子目录中...
前言
你们可能在其他地方看到了很多版本各种各样的二分板子,me too,都很麻烦,一会l=mid+1,一会r=mid+1,特别容易错。直到一个学姐给我们分享了小破站up主“五点七边”的一个视频,她说她一直都用的这个板子。这是一个左开右闭区间 (l, r] 形式的二分查找模板,看了之后,感觉这个板子确实容易理解,还能避免死循环。
视频链接:二分查找为什么总是容易写错?
一、板子
1、二分答案:
注意:
必要时可以将(l + r) / 2
改为l + (r - l) / 2
,可以防止数据溢出long long的范围
。比如,如果l是1e18,r是1e18 + 1000,那么r - l就是1000,除以2就是500,加上l得到1e18 + 500,这显然不会溢出,而直接相加的话1e18 + 1e18 + 1000就会溢出。
bool check(int mid) {
}
int bsearch() {
int l = -1, r = n;
while (l + 1 != r) {
int mid = (l + r) / 2;
if (check(mid)) {
l = mid;
} else {
r = mid;
}
}
return l or r; // 根据题目判断
}
2、浮点二分:
注意:
浮点二分一般用于让结果乘以1000之类的数再输出的题。例如,之前发的二分专题中的I题
和J题
:
bool check(double mid) {
}
int bsearch() {
double l = 0, r = 1e9;
while (r - l > 1e-9) { //这里的精度根据题目而定
double mid = (l + r) / 2.0;
if (check(mid)) {
l = mid;
} else {
r = mid;
}
}
return r;
}