单调性的一定可以二分,但是可以二分的不一定要单调性
只要一个区间内存在一割性质可以将区间一分为二,那么二分就可以找到两个边界(因为是整数二分,所以边界值不会重合)
//c++
//区间[l,r]被划分成[l,mid-1]和[mid,r]
int bsearch1(int l, int r){
while(l < r){
int mid = l + r + 1 >> 1;
if(check(mid)) l = mid;
else r = mid - 1;
return l;
}
//区间[l,r]被划分成[l,mid]和[mid+1,r]
int bsearch2(int l, int r){
while(l < r){
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
return l;
}
# python
def bsearch1(arr, x, l, r): # arr是数组,x是用来check需要的值,l、r是数组区间
while(l < r):
mid = (l + r + 1) // 2
if check(arr,mid,x):
l = mid
else:
r = mid - 1
return l
def bsearch2(arr, x, l, r):
while(l < r):
mid = (l + r) // 2
if check(arr,mid,x):
r = mid
else:
l = mid + 1
return l
给一道题,如何判断它满足哪个板子