二分搜索,你想知道的都在里面了

本文深入解析二分查找算法的三种核心模板,包括基本二分查找、左区间寻找及右区间寻找,详细阐述了每种模板的实现细节与应用场景,帮助读者掌握二分查找的精髓。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板,找到某个元素,否则-1

l, r=0,len(nums)-1
while l<=r: #!注意这里是等于号
	mid = l + (r-l)//2 #(1)防止l+r太大溢出,l+(r-l)>>2也行 (2)趋向于左边的值[1,2]中间为1
	if target==nums[mid]:
		return mid
	elif target>nums[mid] #说明target在右区间:
		l = mid+1
	else:#在左区间
		r = mid-1
return -1 # l=r都没找到(缩小区间聚焦在某一个值)后
	

左区间寻找

找最左边的target,否则-1

l, r=0,len(nums)-1
while l<r: #最后程序停在某个数字上(l==r)
	mid = l+(r-l)//2#中间的值趋向左边的值
	if target> nums[mid]:
		l = mid +1 #右边的正常
	else: # target == nums[mid] 还要往左边找
		r = mid #  因为我们要关注左边的区间,如果找到了一个值,那么我们还要继续找左边的区域
return l if nums[l]==target else -1 #还要判断l==r的时候那个值
	

右区间寻找

找最右边的target,否则-1

l, r=0,len(nums)-1
while l<r: #最后程序停在某个数字上(l==r)
	mid = l+(r-l+1)//2#注意!! 中间的值趋向右边的值,注意这个+1
	if target < nums[mid]:
		r = mid-1 #左边的正常
	else: # target == nums[mid] 还要往右边找
		l = mid #  因为我们要关注右边的区间,如果找到了一个值,那么我们还要继续找右边的区域
return r if nums[r]==target else -1 #还要判断l==r的时候那个值
	

总结

1. 左区间寻找l+(r-l)//2
2. 右区间寻找l+(r-l+1)//2
3. 关注某个区间,另外的一个区间正常缩小

4. 最后结束的时候l==r 需要额外判断这个数字

自己练习:

nums=[5,7,7,7,7,8,8,10] target =7
nums =[7,7,7,7,7,7] target = 7
nums=[5,7,7,7,7,8,8,10], target = 6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万物琴弦光锥之外

给个0.1,恭喜老板发财

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值