折半查找作为一种高效的查找方式被广泛应用,网上也有许多理论的讲解和代码的实现。但是我发现自己手撕的时候容易出现以下的问题,特此记录一下。
首先放一下正确的代码:
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的时候添加一个判断语句来解决上述问题,但是还是建议直接加入 = 实现比较直观 )