一、整数二分查找适用条件
有序数组 2、查找元素
主要思想:对于数组内任意一个元素,都可以让其二分为以下:红色边界点、绿色边界点
![](https://i-blog.csdnimg.cn/blog_migrate/b5dae3ed64c24ad6fcfd3c94bd529f53.png)
一定可以二分,因为是整数,所以无边界
(1)二分处红色边界点(是否满足红色性质)
mid = (l+r+1)/2 为什么要加1,是为了杜绝当l=r-1情况时,mid=(l+r)/2时范围更新失败进入死循环。
if(check(mid)) 1、true---------mid在左侧范围内-----红色边界点所处范围更新为[mid,r]------l=mid
if(check(mid)) 1、false---------mid在右侧侧范围内-----红色边界点所处范围更新为[l,mid+1]-----r=mid+1
(2)二分出绿色边界点
mid=(l+r)/2
if(check(mid)) 1、true---------mid在右侧侧范围内----绿色边界点所处范围更新为[l,mid]-----r=mid
if(check(mid)) 1、false---------mid在左侧侧范围内---红色边界点所处范围更新为[mid+1,r]---------l=mid+1
其中check函数为具体的,到时候需要视题目而言。
算法模板
bool check(int x) //检查x是否满足某种性质
//区间被划分为(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,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; //check(mid)是否满足性质
else r = mid-1;
}
return l;
}