二分算法
二分算法的代码和思想都比较简单,但是在做题时很容易出现边界问题 ,为了在面试或者竞赛时遇到二分类的题目能快速解答,建议将这两个模板理解并背下来。
此代码模板来自Acwing Y总(闫学灿)
二分模板有两个 ,分别适用于不同的情况。
二分算法的思路:假设目标值在闭区间[ l , r ]中,每次去区间中点 mid=( l + r ) / 2将区间长度缩小一半 ,当区间中只有一个数时就找到了目标值

下面将介绍两种不同的区间划分方式对应不同的情况
模板1
将区间[l,r]划分成 [l,mid]和[mid+1,r]时 ,其更新操作是 r = mid或者 l=mid +1计算 mid 时候不需要加1
Java代码模板
public int bsearch(int [] arr ,int l,int r ){
while(l < r){
//分解子问题 这是二分的核心 --范围减半
int mid = l + r >> 1;
if (check(mid)) r = mid; //向左边找
else l = mid + 1; //向右边找
}
return l ;
}
模板2
将区间[l,r]划分成[l,mid-1]和[mid,r]时,其更新策略为 r=mid-1或者 l=mid
此时为了防止程序进入死循环 ,计算mid时需要+1
这里解释一下为什么要+1
当r = l + 1时将会进入死循环 如 数组 [1,2,3]三个数的下标分别为0 , 1 , 2计算mid = (0+2)/2 = 1 代码进入死循环
Java 代码模板
public int bsearch(</

这篇博客详细介绍了二分算法,包括两种不同的代码模板,适用于不同情况。作者强调了在面试或竞赛中理解并记住这些模板的重要性,特别是处理边界问题。文中还通过具体的例子解释了为何在某些情况下计算mid时需要加1,以避免死循环。
1859

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



