折半查找手撕代码实现中容易出现的问题

折半查找作为一种高效的查找方式被广泛应用,网上也有许多理论的讲解和代码的实现。但是我发现自己手撕的时候容易出现以下的问题,特此记录一下。
首先放一下正确的代码:

def BinarySearch(self, nums: List[int], target: int) -> mid[int]:
#成功找到返回下标,否则返回-1
	nums.sort()
    begin = 0
    end = len(nums)-1
    while(begin <= end):
    	mid = (begin+end)//2
	    if nums[mid] == target:
	        break
	    elif nums[mid] > target:
	        end = mid - 1
	    else:
	        begin = mid + 1
	else:
		return -1

1. 右边界初始值问题

end = len(nums)-1。这里容易写成 end = len(nums),即忘记**-1**。
当所求 target 大于所有 nums 中元素时,出现 代码报错 的问题。
举个例子:

nums = [1, 2, 5]
target= 6

第一步:begin=0,end = 3,mid = (begin+end)//2 = 1
第二步:begin = mid+1=2, end = 3,mid=(begin+end)//2 = 2
第三步:begin = mid+1=3, end = 3,mid=(begin+end)//2 = 3
注意 我们的nums数组下标最大是2,因此当执行到 if nums[mid] == target: 这条语句时会发生越界报错

2. 结束标志问题

while(begin <= end): 容易写成 while(begin < end):,即忘记 =
target 是 nums 的 左边界 时,返回结果出错。
举个例子

nums = [1,2,3,5]
target = 5

第一步:begin = 0,end = 4,mid = (begin+end)//2 = 2
第二步:begin = mid+1=3, end = 3,由于 begin == end成立,所以就会跳出while循环,导致返回-1的错误答案。
(ps:当然可以在返回-1的时候添加一个判断语句来解决上述问题,但是还是建议直接加入 = 实现比较直观 )

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值