python二分法搜索

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() 函数拿到结果,决定返回不存在,还是返回值。这样一来,每个函数各司其职,阅读性也能得到一定提高。

猜你喜欢

转载自www.cnblogs.com/lishanstudy/p/12820427.html
今日推荐