1.给定一个非递减整数数组,和一个 target 值,要求你找到数组中最小的一个数 x,满足 x*x > target,如果不存在,则返回 -1。
def solve(lst,target): min = 0 max = len(lst)-1 ret = -1 #指针 while min<=max:#循环条件:还存在可以二分的区间 m = (min+max)//2 #除2 向下取整 if lst[m]**2>target: #如果二分取中间数满足条件 ret = m #指针记录 max = m-1 #缩小区间,将区间取到左半边,max为m-1 因为m已经使用过 else: min = m+1 #缩小区间,将区间取到右半边,min为m+1 因为m已经使用过 if ret == -1: return -1 #不存在满足条件的值 将返回指针初始值-1 else: return lst[ret] print(solve([1,2,3,4,5,6],8)) print(solve([1, 2, 3, 4, 5, 6], 40))
运行结果:
3 -1
代码优化:
def comp(x,target): return x**2>target def binary_search(lst,target): min = 0 max = len(lst)-1 ret = -1 while min<=max: m = (max+min)//2 if comp(lst[m],target): ret = m max = m-1 else: min = m+1 return ret def solve(lst,target): ret = binary_search(lst,target) if ret == -1: return -1 return lst[ret] print(solve([1,2,3,4,5,6],8)) print(solve([1, 2, 3, 4, 5, 6], 40))
运行结果:
3 -1
在这段代码中,我们把不同功能的代码单独提取出来作为独立的函数。其中,comp() 函数作为核心判断,提取出来之后,可以让整个程序更清晰;同时,还把二分搜索的主程序提取了出来,只负责二分搜索;最后的 solve() 函数拿到结果,决定返回不存在,还是返回值。这样一来,每个函数各司其职,阅读性也能得到一定提高。