二分查找及几种变体的Python实现
1. 在不重复的有序数组中,查找等于给定值的元素
循环法
def search(lst, target):
n = len(lst)
if n == 0:
return -1
low = 0
high = n - 1
while low <= high:
mid = (high-low)//2 + low
if lst[mid] == target:
return mid
elif lst[mid] < target:
low = mid +1
elif lst[mid] > target:
high = mid -1
return -1
递归法
def search2(lst, target, low, high):
if low > high:
return -1
mid = (high-low)//2 + low
if lst[mid] == target:
return mid
elif lst[mid] < target:
return search2(lst, target, mid+1, high)
elif lst[mid] > target:
return search2(lst, target, low, mid-1)
2. 查找第一个值等于给定值的元素
def bsearch(lst, value):
n = len(lst)
if n == 0:
return -1
low = 0
high = n - 1
while low <= high:
mid = (high-low) // 2 + low
if lst[mid] < value:
low = mid + 1
elif lst[mid] > value:
low = mid - 1
elif lst[mid] == value:
if mid == 0 or lst[mid-1] != value:
return mid
else:
high = mid - 1
return -1
3. 查找最后一个值等于给定值的元素
def bsearch(lst, value):
n = len(lst)
if n == 0:
return -1
low = 0
high = n - 1
while low <= high:
mid = (high-low) // 2 + low
if lst[mid] > value:
high = mid - 1
elif lst[mid] < value:
low = mid + 1
elif lst[mid] == value:
if mid == n-1 or lst[mid+1] != value:
return mid
else:
low = mid + 1
return -1
4. 查找第一个大于等于给定值的元素
def bsearch(lst, value):
n = len(lst)
if n == 0:
return -1
low = 0
high = n - 1
while low <= high:
mid = (high-low) // 2 + low
if lst[mid] < value:
low = mid + 1
elif lst[mid] >=value:
if mid == 0 or lst[mid-1] < value:
return mid
high = mid - 1
5. 查找最后一个小于等于给定值的元素
def bsearch(lst, value):
n = len(lst)
if n == 0:
return -1
low = 0
high = n - 1
while low <= high:
mid = (high-low) // 2 + low
if lst[mid] > value:
high = mid - 1
elif lst[mid] <= value:
if mid == n-1 or lst[mid+1] > 0:
return mid
low = mid + 1
return -1
二分查找及几种变体的Python实现的更多相关文章
- (转) 干货 | 图解LSTM神经网络架构及其11种变体(附论文)
干货 | 图解LSTM神经网络架构及其11种变体(附论文) 2016-10-02 机器之心 选自FastML 作者:Zygmunt Z. 机器之心编译 参与:老红.李亚洲 就像雨季后非洲大草原许多野 ...
- PriorityQueue和Queue的一种变体的实现
队列和优先队列是我们十分熟悉的数据结构.提供了所谓的“先进先出”功能,优先队列则按照某种规则“先进先出”.但是他们都没有提供:“固定大小的队列”和“固定大小的优先队列”的功能. 比如我们要实现:记录按 ...
- 【Python】Http Post请求四种请求体的Python实现
前言 前几天一个刚接触Python不深的朋友问我的Python的xml格式Post请求怎么发送,刚好最近也在学习Http请求相关的内容,所以决定总结一下各类Post请求的Python实现. Happy ...
- LeetCode总结--二分查找篇
二分查找算法尽管简单,但面试中也比較常见.经经常使用来在有序的数列查找某个特定的位置.在LeetCode用到此算法的主要题目有: Search Insert Position Search for a ...
- 二叉查找树及B-树、B+树、B*树变体
动态查找树主要有二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ), 都是典型的 ...
- js实现二分查找算法
二分查找:是一种搜索某个值的索引的算法. 基本条件:有序的数组. 思路:1.将数组折半,分成左右两个数组. 2.判断要查找的数和中间位置数值的大小,来判断要查找的数实在哪一半. 3.之后继续折半查找, ...
- 【算法】二分查找法&大O表示法
二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...
- JS算法之二分查找
二分查找法主要是解决「在一堆有序的数中找出指定的数」这类问题,不管这些数是一维数组还是 多维数组,只要有序,就可以用二分查找来优化. 二分查找是一种「分治」思想的算法,大概流程如下: 1.数组中排在中 ...
- 二分查找法(binary_search,lower_bound,upper_bound,equal_range)
binary_search(二分查找) //版本一:调用operator<进行比较 template <class ForwardIterator,class StrictWeaklyCo ...
随机推荐
- Bugku-CTF加密篇之进制转换(二进制、八进制、十进制、十六进制,你能分的清吗?)
进制转换 二进制.八进制.十进制.十六进制,你能分的清吗?
- 多表连接面试题:ERROR:Not unique table/alias
class_info id class_name 2 s204 5 s205 1 s207 7 s203 match_info id host_id guest_id match_time mat ...
- .Net Core 2.0 App中读取appsettings.json
引用: Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.FileExtensionsMicrosoft.Ext ...
- 后台接口报500,前端获取报错详情message
最近和前端对接口的时候,前端说后台接口报500,不能获取里面的东西,然后就开始了这个研究,网上查了一些资料,发现报500里面的报错详情是可以获取的. 前端在调用接口的时候,加个catch,注意!!!这 ...
- Angular的启动过程
我们知道由命令 ng new project-name,cli将会创建一个基础的angular应用,我们是可以直接运行起来一个应用.这归功与cli已经给我们创建好了一个根模块AppModule,而根模 ...
- sqli-libs(5-10关)
Less_5 补充基础知识 1. left(a,b)左侧截取a的前b位,正确则返回1,错误则返回o Select left(database(),1)=’s’; 其中database()为sec ...
- 基于SILVACO ATLAS的a-IGZO薄膜晶体管二维器件仿真(04)
在eetop上有好多好东西啊: Silvaco_TCAD_中文教程1 不过这个教程里是Linux系统的,而且工艺仿真占了比较大的篇幅. defect region=1 nta=5e17 wta=0.1 ...
- Django中 from django.utils import timezone 和import datetime的区别
在现实环境中,存在多个时区,用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统,所以如果网站面向的是多个时区用户,只以当前时间为标准开发,便会在时间上产生错误. 为解决这个此类问 ...
- 计算机二级-C语言-程序填空题-190117记录-对文件的处理,复制两个文件,往新文件中写入数据。
//给定程序的功能是,调用函数fun将指定源文件中的内容赋值到指定目标文件中,复制成功时函数返回1,失败时返回0,把复制的内容输出到终端屏幕.主函数中源文件名放在变量sfname中,目标文件名放在变量 ...
- SQL按照某一列数据去重并显示整行信息
mysql按照某一字段去重,并显示其他字段信息.有时候会有一些这样的需求,就是按照sql中的某一列值去重,还要显示其他字段的信息.用distinct进行去重时不能显示整行的信息,对这种需求显然难以满足 ...