1、在有序数组中,找某个数是否存在
def BS_exist(arr,num): #有序数组中,找某个数是否存在
if(len(arr)==0):
return ;
left=0
right=len(arr)-1
while(left<=right):
mid=int(left+(right-left)/2) #防止数组长度很大时溢出
if(arr[mid]==num):
return True
elif(arr[mid]<num):
left=mid+1
else:
right=mid-1
return False
2、在有序数组中,找到大于等于某个数最左边的位置
def BS_nearleft(arr,num): #有序数组中,找到大于某个数最左边的位置
left=0
right=len(arr)-1
index=-1
while(left<=right):
mid=int(left+(right-left)/2)
if(arr[mid]>=num):
index=mid #找到一个,则记录下标,先不返回,继续寻找
right=mid-1
else:
left=mid+1
return index
3、局部最小值问题——二分法在无序数组中的使用
问题描述:有一个无序数组,数组中相邻的数一定不相等,找出一个局部最小值。
分析:
1、若arr[0] < arr[1],arr[0]是局部最小值
2、若arr[n] < arr[n-1],arr[n]是局部最小值。
3、若arr[n-1] < arr[n] < arr[n+1],arr[n]为局部最小值。
在一个无序数组中,如果不满足前面两种情况,数组整体的数据状况就会呈类似于 “抛物线” 的状态,则必定至少含有一个局部最小值。
def M_min(L,M,R): #确定中间数是否最小
if(M<L and M<R):
return True
else:
return False
def BS_AreaMin(arr): #在无序数组中,找出一个局部最小值
if(arr[0]<arr[1]):
return arr[0]
elif(arr[-1]<arr[-2]):
return arr[-1]
else:
Left=0
Right=len(arr)-1
key=False
while(not key):
mid=int(Left+(Right-Left)/2)
if(M_min(arr[mid-1],arr[mid],arr[mid+1])): #判断中间数是否最小
area_min=arr[mid]
key=True #找到一个局部最小值,跳出循环
elif(arr[mid]>arr[mid-1]):
Right=mid #以mid为点,继续二分,在左半区间找
elif(arr[mid]>arr[mid+1]):
Left=mid #以mid为点,继续二分,在右半区间找
return area_min
拓展 : 不只有有序数组才能用二分。
只要能够确定左边可能有,右边一定没有,能够确定甩掉一边,就可以二分。