二分是基本算法之一,其思想并不复杂,一般来说只要结果和数据之间有单调性就可以运用,它可以将O(N)的代码优化为O(logN).
基本模板
bool check(){
if()....return true;
return false;
}
int main(){
int l=1;
int r=n;
while(l<=r){
int mid=(l+r)<<1//mid=(l+r)/2;
if(check()){
l=..
}
else{
r=..
}
}
这篇博客提供的模板就是解决while中的条件如何设置,l和r应该如何变的问题
要领1:闭区间要加减,开区间不变。
要领2:while中的条件是l和r真正取到的值相等(真正取到的值即闭区间就是本身,开区间减一)
要领3:闭区间和开区间的确认就是观察你l和r设的值题目中是否能够取到。
见代码
左闭右开:
while(l<r)
if(check) l=mid+1;
else r=mid//左开右闭格式一样
左闭右闭
while(l<=r)
if(check) l=mid+1;
else r=mid-1;
左开右开
while(l+1!=r)
if(check) l=mid;
else r=mid