二分搜索

参考相关文章:https://www.zhihu.com/question/36132386

直接举例子:

数组:a = [1,2,2,3,3,4,4]

问题:

1. 找到第一个(大于)等于`3`的位置;(答案:`3`)
2. 找到第一个大于`3`的位置;(答案:`5`)
3. 找到最后一个小于(等于)`3`的位置;(答案:`4`)
4. 找到最后一个小于`3`的位置.(答案:`2`)

我们知道用二分法可以解决,也没有一种方法就可以把上面问题都可以解决的!

答案是:有的

我们只要记住第一个问题,后面的问题要不是相似,要不是互补的!也可以不记住,可以参考上面的文章链接,自己理解!

首先前面两个问题都是求下界.后面两个问题求上界.

问题1

就是说,找到第一个(大于)等于3的位置,即找满足x >= value或者x >value条件的最小x的位置.

代码如下:

def lower_bound(array, first, last, value):
	while first < last:
		mid = first + (last - first) // 2
		if array[mid] < value:
			first = mid + 1
		else:
			last = mid
	return first

代码解释:

first:是列表的开始位置,last:是列表的结束位置,value:是搜索的值

Note:

  1. 取中位数,使用first + (last - first) // 2,详细说明请看上面链接
  2. if的判断条件为 <
  3. 满足条件:first+1,else语句则不需要
  4. 返回firstlast一样,两个值相等

测试代码:

a = [1, 2, 2, 3, 3, 4, 4]
print(lower_bound(a, 0, 7, 3))

显示结果:

3

问题2

就是说,找到第一个大于3的位置,即第一个大于value的位置.

代码如下:

def lower_bound(array, first, last, value):
	while first < last:
		mid = first + (last - first) // 2
		if array[mid] <= value:
			first = mid + 1
		else:
			last = mid
	return first

代码解释:

聪明的小伙伴,已经发行不同了,就是if 的判断条件变成<=

测试代码:

print(lower_bound(a, 0, 7, 3))

显示结果:

5

问题3

问题3和问题2是互补的,只要把问题2,得出结果-1,就是这道题答案.

问题4

问题4和问题1是互补的,只要把问题1,得出结果-1.


自己体会吧!

掌握这个万能的二分搜索,妈妈再也不用担心我的学习啦!

嘻嘻!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值