二分的前提是有序数列,也就是满足有界性和单调性
当数列有序之后,使用二分可以快速找到目标元素,它的空间复杂度是 , 时间复杂度是 (以2为底)
也就是说假设需要在110个元素里面查找目标元素,我们只需要查找7次 ——
话不多说直接上板子:
适用于答案在左半区间,一般适用于求解最小化最大值 也就是求最小值
当区间[l, r]的更新操作是 r = mid; l = mid + 1; 时,计算mid时不需要加1
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
适用于答案落在右半区间,一般适用于求解最大化最小值 也就是求最大值
当区间[l, r]的更新操作是 r = mid - 1; l = mid; 时,计算mid时需要加1
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;
}
二分答案:
好用到流泪啊!! awsl
int binary(int n)
{
int l = 1, r = n;
while(l <= r) //注意要有=
{
int mid = (l + r) >> 1;
if(check(mid))
{
update(ans); //更新答案
l = mid + 1;
}
else
r = mid - 1;
}
return ans;
}