1. 不小于某数的第一个元素

def bisearch(l, e, lo, hi):while lo < hi:mi = (lo + hi)//2if e > l[mi]: lo = mi + 1else: hi = mireturn hi

注:

  • (1)不同于寻找等于某值的情况(且找到即可,不要求第一个),体现在代码中,就是判断逻辑;

2. 不大于某数的最后一个元素

def binsearch(l, e, lo, hi):while lo < hi-1:mi = (lo + hi)//2if e >= l[mi]: lo = mielse: hi = mireturn lo

注:另外的两种情况,

  • 1) 不大于某数的第一个元素 ⇒ 既然有序,左端遍历即可;
  • 2) 不小于某数的最后一个元素 ⇒ 既然有序,从尾端开始遍历即可;

没有实质的意义。

3. 传统的二分支和三分支的版本(判等)

# 三分支
def binsearch(l, e, lo, hi):while lo < hi:mi = (lo + hi)//2if l[mi] > e: hi = mielif: l[mi] < e: lo = mi + 1else: return mireturn lo if A[lo] == e else -1# 二分支
def binsearch(l, e, lo, hi):while lo < hi - 1:mi = (lo + hi)/2if e < l[mi]: hi = mielse: lo = mireturn lo if A[lo] == e else -1

请注意,以上的两个版本(三分支和二分支):

  • 三分支:直接返回居中的符合条件的即可,不考虑相对顺序
  • 二分支:其实返回的是最后一个等于某值元素
l = [4, 4, 4, 4, 4]
binsearch(l, 4, 0, 5)# 对于三分支而言,返回的是 2# 对于二分支而言,返回的是 4

4. 返回值等于某值的第一个元素(最后一个元素)

4.1 值等于某值的第一个元素

其实可以泛化地理解为值不小于某值的第一个元素,也就是本文开篇的第一个代码段:

def binsearch(l, e, lo, hi):while lo < hi:mi = (lo + hi)//2if e > l[mi]: lo = mi + 1else: hi = mireturn hi

4.2 值等于某值的最后一个元素

其实就是 Part3 中的二分支版本;
也即:

def binsearch(l, e, lo, hi):while lo < hi:mi = (lo + hi)//2if e < l[mi]: hi = mielse: lo = mireturn lo

二分查找 —— 有序数组不小于(不大于)某数的第一个(最后一个)元素相关推荐

  1. c语言中的数组二分法排序程序,#C语言#二分法查找有序数组

    C语言的二分法,想必很多朋友都在初学时是一个难啃的骨头,因为这是必须掌握的最基础的一种算法.在这里我分享一下这个简单的#二分法#查找有序数组 #include int binary_search(in ...

  2. 二分法查找是基于有序_利用二分法查找有序数组中是否含有给定Value

    //利用二分法查找有序数组中是否含有给定Value class AlgorithmByZXQ { /// /// 二分法查找数组中某一数值 /// /// /// /// /// /// public ...

  3. 查找有序数组(二分法)(时间复杂度O(logn))——C++

    查找有序数组指定元素,返回目标元素下标,如果不存在,则插入适当位置使数组仍然保持有序,时间复杂度为O(log(n)),该算法是基本查找算法,可以用二分法.下面是代码实现. class Solution ...

  4. 如何用二分查找法查找有序数组

    一.程序简述 需要查找一个数字在数组中的位置,可以使用二分查找法在一个有序数组中查找具体的某个数字n 二.程序要点 1.普通的遍历查找方法的复杂度为n,那么二分查找算法的复杂度就是log2n 2.二分 ...

  5. 二分查找:在有序数组中搜索大于等于x的数的最小下标

    标准的二分查找,大家可能都已经能记在脑海里了,但是稍微变形一下,可能就会出问题. 本文写了一个二分查找算法,并且做了一个测试的脚手架,用二分查找和普通算法的结果进行比较来验证算法的正确性. 1 #in ...

  6. java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...

    顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...

  7. java 二分搜索获得大于目标数的第一位_程序员数据结构算法编程,二分查找搜索算法的原理与应用介绍!...

    本文来讲一种搜索算法,即二分搜索算法,通常在面试时也会被问到. 我们先来看一个例子,在图书馆通常是根据查到的编号去找书,可以在书架上按顺序一本本地查找,也可以找到一本书不符合预期时,再跳过一大部分书再 ...

  8. 二分查找以及数组下标的移动规律

    二分查找算法 复杂度log⁡2N\log_2Nlog2​N 二分查找的前提是待查找的序列必须是有序的.另外一点,C++中的序列都是前闭后开的.如果使用STL,默认是递增顺序,递减的顺序需要自定义比较函 ...

  9. 【leetcode】644 最大子段和 II(二分查找,数组)

    题目链接:https://leetcode-cn.com/problems/maximum-average-subarray-ii/ 题目描述 给定一个包含 n 个整数的数组,找到最大平均值的连续子序 ...

最新文章

  1. aboboo 上一句 快捷键_锁定微信防别人偷看,苹果电脑上的微信有何不同?
  2. couchbase_Spring Data Couchbase 1.0 GA发布
  3. 【MaxCompute学习】隐式转化的问题
  4. python写传奇脚本,Python趣味打怪:60秒学会一个例子,147段简单代码助你从入门到大师 | 中文资源...
  5. mybatis异常:Could not find result map ......... 问题分析及解决
  6. 标准SPI、DUAL SPI、Quad SPI
  7. idea 快捷键修改去除 自动导入import 相关整理
  8. java jdk使用教程_java初学者实践教程2-jdk的使用
  9. python16_day14【jQuery】
  10. matlab函数表达式里分号_matlab中分号
  11. mysql root 访问被拒绝_mysql-“连接失败:用户'root'@'localhost'(使用密码:是)的访问被拒绝”...
  12. 自动驾驶是一门怎样的生意?盘点5家创业公司商业落地的3条逻辑...
  13. Plant Simulation中的“开机自启”-autoexec
  14. AUTOMATE THE BORING STUFF WITH PYTHON读书笔记 - 第19章:MANIPULATING IMAGES
  15. 鸿蒙车载智慧屏评测,搭载鸿蒙系统的荣耀智慧屏值得入手吗?荣耀智慧屏全面评测...
  16. 51单片机C语言波特率十六进制,8051单片机波特率计算公式(配套C语言例程)
  17. [BZOJ5139][Usaco2017 Dec]Greedy Gift Takers 权值线段树
  18. 豆豆亮亮三岁生日快乐!
  19. java javax org_java mail程序--ClassNotFoundException:javax.mail.Address
  20. 苹果手机使用百度地图定位失败的问题

热门文章

  1. Qtcreator配置Ros环境
  2. 数据建模的的参考工具EZDML
  3. java判断是否能上网_用Java检测远程主机是否能被连接
  4. vue 高德轨迹自定义两点之间的颜色_vue 还是 react?这是一个问题
  5. html post与get的区别,post 和get请求的区别(html)
  6. java byte to integer_Java中的Byte转为无符号的Integer
  7. python常见的函数和类方法
  8. 数据迁移的应用场景与解决方案Hamal
  9. 线段树模板(HDU 6356 Glad You Came)
  10. 计算机丨浏览器访问出现DNS_PROBE_POSSIBLE解决方法