首先是二分查找,举个有序的整数数组例子(二分查找和搜索都是针对有序数组)

 public int rank(int key, int n) {int lo = 0, hi = n - 1;while (lo <= hi) {int mid = lo + ((hi - lo) >> 1); //>>1是除以2// 为什么不直接(lo+hi)>>1呢,因为lo+hi可能溢出,而hi-lo不溢出,lo+(hi-lo)>>1是小于hi的,也不溢出,更安全int cmp = key - a[mid];// a为有序数组if (cmp < 0) {hi = mid - 1;} else if (cmp > 0) {lo = mid + 1;} else {return mid;}}return lo;}

如果查找到,返回数组下标mid,如果没找到,return lo;有人会问了为什么返回lo??当然你非要在找不到的情况下返回一个负数比如-1也可以。这就是关键所在,假设a[10]={1, 2, 5, 7, 7, 12, 13, 17, 18, 20};我要查找的key是6。

第一步:lo   hi   mid

0     9     4

0     3     1        a[4]=7 > key=6,所以hi=mid - 1=3;    lo=0  <=  hi=3继续循环,mid=(lo+hi)/2=1

2     3     2        cmp = 6-a[1] > 0,所以lo=mid+1=2,lo=2  <=  hi=3继续循环,mid=(lo+hi)/2=2

3     3     3        cmp = 6-a[2] > 0,所以lo=mid+1=3,lo=3  <=  hi=3继续循环,mid=(lo+hi)/2=3

3     2               cmp = 6-a[3] < 0,所以hi=mid-1=2, 此刻不满足套件,跳出,返回lo=3

返回3什么意思?你看看这个数组,是不是小于6有3个元素?

lo的值正好等于数组中小于被查找的元素的数量

那怎么知道有没有找到呢?返回的到底是命中的下标还是小于被查找元素数量呢?

用  i=rank(key, n); // 在n个元素的数组查找key=6,返回下标传给i

if (i<n&&a[i] == key){表示找到了}

else  {没找到}

一些有序集合判断,如果集合包含这些元素,就更新数值,if(i<n&&a[i] == key){更新数值}。或者要插入的位置在哪里?假如lo=5,我查找一遍,就知道他前面有5个元素,即我这次要插入的元素下标就为5(从0开始计算)

下面讲一下二分搜索

比如从有序数组中查找某个数值

lower_bound

给定长度为n的单调不下降数列a0, a1,...an-1和一个数k,求满足ai≥k条件的最小的i。不存在的情况输出n。

限制条件

1≤n≤106

0≤a0≤a1≤...≤an-1<109

0≤k≤109

输入

n = 5

a = {2, 3, 3, 5, 6}

k = 3

输出

1(其中a0<3, a1>=3)

这里不仅仅是二分查找了,不仅是找到下标,而是找到最小的下标

直接上代码(关键部分)

   int n, k;int[] a = new int[1000001];public void solve() {int lo = 0, hi = n;while (hi > lo) {int mid = lo + ((hi - lo) >> 1);if (a[mid] >= k) {hi = mid;} else {lo = mid;}}System.out.println(hi);// 最后hi和lo一样,就算找不到的情况返回n,这种情况下lo=hi=n,返回哪个都一样}

比如a[5]={2, 3, 3, 5, 6}

a[2]=3和3进行比较,可以知道解不大于2

a[1]=3和3比较,可以知道解不大于1

a[0]=2和3比较,可以知道解不小于0

所以解为1

二分搜索法是通过不断缩小解的可能存在的范围,从而求得问题最优解的方法。

========================================Talk is cheap, show me the code=======================================

关于二分查找和二分搜索相关推荐

  1. js实现二分查找(二分搜索)

    首先了解什么是数据结构和算法 数据结构 = 数据结构 + 算法 数据结构:用来存储数据的数组 算法:暴力搜索,二分搜索 二分搜索:是一个搜索某个值的索引的算法 条件:在一个有序的数组中查找一个特定的元 ...

  2. 二分(二分查找,二分搜索)

    二分模板 浮点数二分 double l=0,r=x; while(r-l>1e-(k+2))//保留k位小数 {double mid=(l+r)/2;if(check(mid)){l=mid;} ...

  3. 二分查找 (二分搜索) 最通俗易懂的图解与实现

    二分查找场景 二分搜索用于在一个单调或者局部单调有序数组中查找一个符合某些条件的值,时间复杂度为O(logN) 二分查找原理图解 拿升序数组为例子进行解释,假设我们需要再数组中找到目标值key的下标. ...

  4. 折半查找(二分查找)

    折半查找(二分查找) 1.折半查找法,也称为二分查找法, 二分搜索, 是一种在有序数组中查找某一特定元素的搜索算法.搜索过程中从数组的中间元素开始, 如果中间元素正好是要查找的元素, 则搜索过程结束: ...

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

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

  6. 【基础算法】二分法(二分答案,二分查找),三分法,Dinkelbach算法,算法详解+例题剖析

    目录 一 . 二分法 二分搜索得要求: 二分查找步骤: 二分答案: 玄学的二分(二分答案) 二 . 三分法 例题 三.01分数规划问题相关算法与题目讲解(二分法与Dinkelbach算法) 一 . 二 ...

  7. 面试前必知必会的二分查找及其变种

    今天给大家带来的是二分查找及其变种的总结,大家一定要看到最后呀,非常非常用心的一篇文章,废话不多说,让导演帮我们把镜头切到袁记菜馆吧! 袁记菜馆内.... 店小二:掌柜的,您进货回来了呀,哟!今天您买 ...

  8. C++实现二分查找(递归方法和非递归方法)

    需要注意的一个地方:middle=start+(end-start)/2;//假如,left与right之和超过了所在类型的表示范围的话,那么middle就不会得到正确的值.所以写成这种形式稳妥 另外 ...

  9. 5、leetcode剑指offer53 二分查找之0~n-1缺失的数字**

    leetcode剑指offer53 二分查找之0~n-1缺失的数字 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个 ...

最新文章

  1. 计算机应用基础中什么是桌面,福师《计算机应用基础》在线作业二 Windows中进行系统设置的工具集是 用户可以根据自己的爱好更改显示器 键盘 鼠标器 桌面等硬件的设置...
  2. Oracle 12c In-Memory Option应用解析
  3. Mycat社区出版: 分布式数据库架构及企业实践——基于Mycat中间件
  4. c# AutoResetEvent和ManualResetEvent
  5. python 爬取贝壳网小区名称_Python爬虫实战:爬取贝壳网二手房40000条数据
  6. Linux-实用快捷键操作
  7. CSS3属性box-shadow使用教程
  8. Python 爬虫分析豆瓣 TOP250 告诉你程序员业余该看什么书?
  9. python图书馆预约系统_python实现图书馆研习室自动预约功能
  10. windows下怎么样搭建RobotFramework测试环境
  11. ubuntu网络设置找不到有线连接_win7系统找不到网络打印机如何解决?局域网打印机共享怎么设置?...
  12. 华为查看mpls的命令_华为BGP基本命令
  13. 如何用计算机算十进制,计算器怎么,计算机是怎么转换二进制为十进制的
  14. 爸爸去哪儿第三季之刘诺一8.1第四期
  15. 如何在C加加的面向对象写石头剪刀布游戏
  16. 怎么才能制作一个比较好的网站
  17. 搜索引擎搜索特定网站的方法 :site
  18. 作UML图的软件有哪些
  19. LCD液晶屏表面存在的缺陷及检测应用分析
  20. chinapay 新版php接口,php最新银联支付chinaPay,最新接口地址

热门文章

  1. 双模加持丨极海半导体GW3323智能蓝牙手环应用方案
  2. Parallels Desktop | Mac 系统超好用的虚拟机,不来试试吗
  3. Android简易天气预报App
  4. python之elasticsearch使用
  5. MFC:如何利用C++使得输出文本颜色、字体多变
  6. M2 NGFF PCIE NVME
  7. 自动化的签到托管系统搭建教程/可以整合各类平台等加入
  8. 分享88个ASP聊天室,总有一款适合您
  9. java 图形化界面编程--awt编程
  10. Java邮件群发系统