LT.852二分法查找指定数字,绝对值最小的数

二分法查找指定数字:

非递归版

def BinarySearch(nums,target):
    left,right=0,len(nums)-1
    #注意这里一定要是"<="
    while(left<=right):
        middle=left+(right-left)//2
        if nums[middle]==target:
            return middle
        #注意这里left和right的更新
        elif nums[middle]<target:
            left=middle+1
        else:
            right=middle-1
    return -1
nums=[1,2,3,4,5,6,7,8,9]
target=1
print (BinarySearch(nums,target))

递归版 

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)

testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))

 

 二分法查找有序数组中绝对值最小的数:

1.中间数恰为0,返回

2.中间数>0,说明绝对值最小的数字在左边;否则在右边。

3.最后的两个数其中之一就是绝对值最小的数。

另一种思路和上边类似,但显冗余:

左边第一个数字大于零,绝对值最小就是左边第一个数;数列最右边的数字小于零,绝对值最小的数的数就是右一。否则进入上边方法的第三第三种情况。

下面代码实现第一种:

def findMinAbs(nums):
	left,right=0,len(nums)-1
	while(left<right):
		mid=left+(right-left)//2
		if nums[mid]==0:
			return nums[mid]
		#注意这里对left和right的更新方式,因为不确定mid是不是绝对值最小的
		#所以不能用mid+1和mid-1来更新left和right
		elif nums[mid]>0:
			right=mid
		else:
			left=mid
		if (right-left==1):
			return nums[left] if abs(nums[left])<abs(nums[right]) else nums[right]
nums1=[-9,-8,-7,-6,-2,0,1,2,3,4,5]
nums2=[2,3,4,5,6,7]
nums3=[-9,-8,-7,-6,-2]
nums4=[-9,-8,-7,-6,-2,3,4,5]
nums5=[-9,-8,-7,-6,3,4,5]
print(findMinAbs(nums1))
print(findMinAbs(nums2))
print(findMinAbs(nums3))
print(findMinAbs(nums4))
print(findMinAbs(nums5))

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值