二分法可以分为二分查找,和二分区间,这两个是有区别的,一定要分清
[l,r]
k=0
// 闭区间,需要等号
for l<=r {
// l<=mid<r
mid = (l+r) / 2
if check(s[mid]) k=mid break
else if s[mid] > target {
r = k
}else{
l = k+1
}
}
二分区间,则分为左边界和由边界,左边界:[0,k] [k+1,n-1],右边界:[0,k-1],[k,n-1]
对于闭区间[l,r]
l<=mid<r :用于返回左区间
mid= (l+r)/2
// l<mid<=mid; 用于返回右区间
mid2= (l+r+1)/2
a[k] 符合左边界条件
使用比较熟悉的闭区间,[l,r],这样不会有数组越界,同时使用使用mid=(l+r)/2, 那么其缩小的方式就固定了,r=k或者l=k+1,这是要避免区间死循环。同时其退出条件为l<=r,因为是闭区间,要保证能够全部访问到
l,r:=0,len(nums)-1
k:=0
// 二分法,的边界条件,a[k]要最小
for l<=r{
// 下边界效应
k=(l+r) /2
fmt.Println(k)
// 满足条件 如果使用<=,就可能死循环
if nums[k] < nums[r]{
r = k
}else{
l = k+1
}
}