二分算法思想
我们目标区间定为[l, r], 每次缩小一半的空间,知道l = r时我们就找到目标值
整数二分
版本1
当我们把区间划分为[l, mid]和[mid + 1, r]时,即我们每次令r = mid或l = mid + 1;
算法模板
int bsearch_1(int l, int r)
{
while(l < r)
{
int mid = (l + r) >> 1; //相当于(l + r) / 2
if(check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
版本2
当我们把区间划分为[l, mid-1]和[mid, l]时,即我们每次令r = mid-1或者l = mid;
算法模板
int bsearch_1(int l, int r)
{
while(l < r)
{
int mid = (l + r + 1) >> 1; //此处+1为了防止死循环,
if(check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
注意以上为整数的二分需要特别注意防止死循环
简便记法,当mid赋值给r时不需要+1,当mid赋值给l时需要+1;
浮点数二分
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;
}
文章参考:https://www.acwing.com/blog/content/31/
个人学习使用
573

被折叠的 条评论
为什么被折叠?



