二分法查找——绝对值最小的数

题目

有一个已经排好序的整数序列(升序,无重复项),序列中可能有正整数、负整数或者0,请用你认为最优的方法求序列中绝对值最小的数

思路:

  1. 分为三种情况:
    1. 所有整数不大于0
    2. 所有整数不小于0
    3. 正负整数都存在
  2. 使用二分查找,一直逼近0,然后比较0两边的数

代码:

def binary_search(li):
    if li[0] >= 0:
        return li[0]
    elif li[-1] <= 0:
        return li[-1]
    else:
        left, right = 0, len(li)-1
        while left < right:
            mid = (left + right) // 2
            if li[mid] <= 0 and li[mid+1] > 0:
                if abs(li[mid]) < abs(li[mid+1]):
                    return li[mid]
                else:
                    return li[mid-1]
            elif li[mid] > 0:
                right = mid - 1
            elif li[mid] < 0:
                left = mid + 1

li  = [-17,-12,18,-3,-1,0,2,5,6,7]
print(li)
a = binary_search(li)
print(a)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值