如何理解二分查找中不存在元素返回-1的断言逻辑?
为什么二分查找函数对不存在的元素返回-1?
你的二分查找函数中,当目标元素不在数组内时返回-1,是因为循环遍历完所有可能的搜索区间后仍未找到匹配项,就会执行最后的return -1。下面结合你举的两个例子拆解执行过程:
首先贴出你的实现代码:
def search(arr, target): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 # 向下取整 if arr[mid] == target: return mid elif target < arr[mid]: right = mid - 1 else: left = mid + 1 return -1
示例数组:arr = [-2, 3, 4, 7, 8, 9, 11, 13]
情况1:目标元素比数组所有元素大(比如14)
一步步追踪循环执行:
- 初始状态:
left=0,right=7(数组长度为8,索引范围0-7) - 第一次循环:
mid=(0+7)//2=3,arr[3]=7 < 14,所以调整左边界:left=3+1=4 - 第二次循环:
left=4 ≤ right=7,mid=(4+7)//2=5,arr[5]=9 <14,调整左边界:left=5+1=6 - 第三次循环:
left=6 ≤ right=7,mid=(6+7)//2=6,arr[6]=11 <14,调整左边界:left=6+1=7 - 第四次循环:
left=7 ≤ right=7,mid=(7+7)//2=7,arr[7]=13 <14,调整左边界:left=7+1=8 - 此时
left=8,right=7,left <= right的条件不成立,循环结束,执行return -1
情况2:目标元素比数组所有元素小(比如-4)
同样追踪循环:
- 初始状态:
left=0,right=7 - 第一次循环:
mid=3,arr[3]=7 > -4,调整右边界:right=3-1=2 - 第二次循环:
left=0 ≤ right=2,mid=(0+2)//2=1,arr[1]=3 > -4,调整右边界:right=1-1=0 - 第三次循环:
left=0 ≤ right=0,mid=0,arr[0]=-2 > -4,调整右边界:right=0-1=-1 - 此时
left=0,right=-1,left <= right的条件不成立,循环结束,执行return -1
核心逻辑总结
这个二分查找的循环条件left <= right意味着:只要当前搜索区间内还有元素,就继续检查。一旦循环退出,说明整个数组的所有元素都被排查过,但没有找到目标元素。返回-1是二分查找里的通用约定——用这个特殊值明确标记“未找到目标”,和“找到目标返回对应索引”的结果做区分。
内容的提问来源于stack exchange,提问作者17spr
相关产品推荐
相关产品推荐

