面试官:会二分查找吗?来,写一下
def binary_search(alist,num): n = len(alist) if len(alist) == 0: return False mid = n // 2 if alist[mid] == num: return True elif alist[mid] < num: return binary_search(alist[mid+1:],num) else: return binary_search(alist[0:mid],num) if __name__ == "__main__": li = list(range(1,40,4)) print(binary_search(li,23)) # def binary_search(alist, item): # if len(alist) == 0: # return False # else: # midpoint = len(alist)//2 # if alist[midpoint] == item: # return True # else: # if item < alist[midpoint]: # return binary_search(alist[:midpoint],item) # else: # return binary_search(alist[midpoint+1:],item)
面试官:假如我找不到这个数,我需要返回这个数的所在区间,你怎么改:
答:再开两个变量,用以记录每次比较的 alist[mid],
def binary_search(alist,num,left=0,right=0): n = len(alist) if len(alist) == 0: return [left,right] mid = n // 2 if alist[mid] == num: return True elif alist[mid] < num: left = alist[mid] return binary_search(alist[mid+1:],num,left,right) else: right = alist[mid] return binary_search(alist[0:mid],num,left,right)
还有一种就是让你返回和寻找的目标值接近的数,就比较一下左边界和由边界即可得到
面试官:那么给你的输入类似于这样的,li = [21, 25, 29, 33, 37,1, 5, 9, 13, 17, ],它原本是一个有序的数组,循环移动过了一些元素,现在我需要找到里面的最小数,你会用什么办法
1.最直接的就是 res = min(li),但这多半被扣分,
2.直接遍历,冒泡得到最小的,O(n),效果一般般,
3.前面他问这么多二分查找,只用二分查找得到转折的区间,那个小的数就是最小数了
li[mid] 和 li[-1] 进行比较,37 > 17,说明最小数在 li[mid+1:]
反之说明在 li[:mid+1] 这里的 mid+1 要取到,不然可能遗漏了一点
def minnums(ali):
if len(ali) == 0:
return
elif len(ali) == 1:
return ali
elif len(ali) == 2:
if ali[0] < ali[1]:
return ali[0]
else:
return ali[1]
else:
mid = len(ali) // 2
if ali[mid] > ali[-1]:
return minnums(ali[mid+1:])
else:
return minnums(ali[:mid+1])
原文:https://www.cnblogs.com/xtoshii/p/13022245.html