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实现的更多相关文章

  1. (转) 干货 | 图解LSTM神经网络架构及其11种变体(附论文)

    干货 | 图解LSTM神经网络架构及其11种变体(附论文) 2016-10-02 机器之心 选自FastML 作者:Zygmunt Z. 机器之心编译  参与:老红.李亚洲 就像雨季后非洲大草原许多野 ...

  2. PriorityQueue和Queue的一种变体的实现

    队列和优先队列是我们十分熟悉的数据结构.提供了所谓的“先进先出”功能,优先队列则按照某种规则“先进先出”.但是他们都没有提供:“固定大小的队列”和“固定大小的优先队列”的功能. 比如我们要实现:记录按 ...

  3. 【Python】Http Post请求四种请求体的Python实现

    前言 前几天一个刚接触Python不深的朋友问我的Python的xml格式Post请求怎么发送,刚好最近也在学习Http请求相关的内容,所以决定总结一下各类Post请求的Python实现. Happy ...

  4. LeetCode总结--二分查找篇

    二分查找算法尽管简单,但面试中也比較常见.经经常使用来在有序的数列查找某个特定的位置.在LeetCode用到此算法的主要题目有: Search Insert Position Search for a ...

  5. 二叉查找树及B-树、B+树、B*树变体

    动态查找树主要有二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ), 都是典型的 ...

  6. js实现二分查找算法

    二分查找:是一种搜索某个值的索引的算法. 基本条件:有序的数组. 思路:1.将数组折半,分成左右两个数组. 2.判断要查找的数和中间位置数值的大小,来判断要查找的数实在哪一半. 3.之后继续折半查找, ...

  7. 【算法】二分查找法&大O表示法

    二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...

  8. JS算法之二分查找

    二分查找法主要是解决「在一堆有序的数中找出指定的数」这类问题,不管这些数是一维数组还是 多维数组,只要有序,就可以用二分查找来优化. 二分查找是一种「分治」思想的算法,大概流程如下: 1.数组中排在中 ...

  9. 二分查找法(binary_search,lower_bound,upper_bound,equal_range)

    binary_search(二分查找) //版本一:调用operator<进行比较 template <class ForwardIterator,class StrictWeaklyCo ...

随机推荐

  1. js中map和filter方法,以及search方法

    链接:https://blog.51cto.com/11871779/2126561 search方法: 介绍: search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符 ...

  2. Ubuntu18.04安装caffe python3.6 opencv3.2 CPU

    设置ubuntu的softwares&updates的源为国内源,这样会提高下载速度. 如果是安装python相关库,为提高速度使用: pip3 install 要下载的库 -i https: ...

  3. apt-get install 下载速度慢问题的解决

    参考博客:https://blog.csdn.net/weixin_38538240/article/details/99665433 重点:在software&updates中更换为国内的源 ...

  4. QQ发起聊天

    QQ推广 网址: http://shang.qq.com/v3/widget.html 一键加群 实例: <a target="_blank" href="//sh ...

  5. 前端——语言——Core JS——《The good part》读书笔记——第八章节(Methods)

    本章介绍JS核心对象的方法.这些对象包括Array,Function,Number,Object,RegExp,String.除这些常用的核心对象还有Date,JSON. 本章更偏向于API文档,介绍 ...

  6. go基础_控制语句

    if控制语句 说明:(1)if后面的条件语句不用加括号 (2)if后面可以跟一个简单的初始化语句,并以分号分割,初始化语句中的变量的作用域是整个if语句块 (3)if语句的条件语句需要尽量简单 (4) ...

  7. Docker配置阿里云镜像源

    Docker默认拉取镜像是从这里拉取(https://hub.docker.com/),拉取的速度让人...,所以是配置国内镜像源,拉取速度十分惊人 一.版本要求 Docker版本:1.10以上 二. ...

  8. 归并非递归、快排递归及非递归的C++实现及时间效率对比。。

    今天看剑指offer突然发现下学期都要去面试了,还没自己实现过快排非递归和归并非递归,这怎么能行呢,于是就写了一下. (虽然有点卡壳,又回去翻了下算导,还是顺利写出来了) 先放图: 一亿数据量: #p ...

  9. 通过ping和tracert命令来判断网络经过多少个路由。trace和route合作

    摘抄自: https://blog.csdn.net/foreverhuylee/article/details/49853075 当我们访问某个网络时,通过tracert命令,就能知道本机与目标主机 ...

  10. Spring的事务实现原理

    主流程 Spring的事务采用AOP的方式实现. @Transactional 注解的属性信息 name                当在配置文件中有多个 TransactionManager , ...