几种常见的应用场景:寻找一个数、寻找左侧边界、寻找右侧边界

细节(不等号是否应该带等号,mid 是否应该加一等等)

int binarySearch(int[] nums, int target) {int left = 0; int right = nums.length - 1; // 注意while(left <= right) {int mid = left + (right - left) / 2;if(nums[mid] == target)return mid; else if (nums[mid] < target)left = mid + 1; // 注意else if (nums[mid] > target)right = mid - 1; // 注意}return -1;
}

1、为什么 while 循环的条件中是 <=,而不是 <?

答:因为初始化 right 的赋值是 nums.length - 1,即最后一个元素的索引,而不是 nums.length。

这二者可能出现在不同功能的二分查找中,区别是:前者相当于两端都闭区间 [left, right],后者相当于左闭右开区间 [left, right),因为索引大小为 nums.length 是越界的。

我们这个算法中使用的是前者 [left, right] 两端都闭的区间。这个区间其实就是每次进行搜索的区间。

什么时候应该停止搜索呢?当然,找到了目标值的时候可以终止:

    if(nums[mid] == target)return mid; 

但如果没找到,就需要 while 循环终止,然后返回 -1。那 while 循环什么时候应该终止?搜索区间为空的时候应该终止,意味着你没得找了,就等于没找到嘛。

while(left <= right) 的终止条件是 left == right + 1,写成区间的形式就是 [right + 1, right],或者带个具体的数字进去 [3, 2],可见这时候区间为空,因为没有数字既大于等于 3 又小于等于 2 的吧。所以这时候 while 循环终止是正确的,直接返回 -1 即可。

while(left < right) 的终止条件是 left == right,写成区间的形式就是 [left, right],或者带个具体的数字进去 [2, 2],这时候区间非空,还有一个数 2,但此时 while 循环终止了。也就是说这区间 [2, 2] 被漏掉了,索引 2 没有被搜索,如果这时候直接返回 -1 就是错误的。

当然,如果你非要用 while(left < right) 也可以,我们已经知道了出错的原因,就打个补丁好了:

    //...while(left < right) {// ...}return nums[left] == target ? left : -1;

2、为什么 left = mid + 1,right = mid - 1?我看有的代码是 right = mid 或者 left = mid,没有这些加加减减,到底怎么回事,怎么判断?

答:这也是二分查找的一个难点,不过只要你能理解前面的内容,就能够很容易判断。

刚才明确了「搜索区间」这个概念,而且本算法的搜索区间是两端都闭的,即 [left, right]。那么当我们发现索引 mid 不是要找的 target 时,下一步应该去搜索哪里呢?

当然是去搜索 [left, mid-1] 或者 [mid+1, right] 对不对?因为 mid 已经搜索过,应该从搜索区间中去除。

3、此算法有什么缺陷?

答:至此,你应该已经掌握了该算法的所有细节,以及这样处理的原因。但是,这个算法存在局限性。

比如说给你有序数组 nums = [1,2,2,2,3],target 为 2,此算法返回的索引是 2,没错。但是如果我想得到 target 的左侧边界,即索引 1,或者我想得到 target 的右侧边界,即索引 3,这样的话此算法是无法处理的。

这样的需求很常见,你也许会说,找到一个 target,然后向左或向右线性搜索不行吗?可以,但是不好,因为这样难以保证二分查找对数级的复杂度了。

我们后续的算法就来讨论这两种二分查找的算法。

二分法的算法及应用场景(只更新了一种)相关推荐

  1. 智能推荐算法在直播场景中的应用

    本文概览: 1. 推荐系统是什么? 推荐系统是帮助用户发现内容,克服信息过载的重要工具: 它通过分析用户行为,对用户兴趣建模.从而预测用户的兴趣并给用户做推荐: 信息过载: 信息过载是信息时代信息过于 ...

  2. keras优化算法_自然场景文本识别(OCR),keras-yolo3-densenet-ocr

    自然场景文本识别 我之前是做自然语言的,但公司有个ocr的项目必须要做,因此开始学习ocr相关知识,边学边做两个多月,还有很多不太明白的地方,只能大概讲一讲经验教训. 自然场景文本分类包括两个步骤,1 ...

  3. etc的常见算法_几个常用算法的适应场景及其优缺点(非常好)

    本文主要回顾下几个常用算法的适应场景及其优缺点! 机器学习算法太多了,分类.回归.聚类.推荐.图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验. ...

  4. Interview:算法岗位面试—10.15上午—上海某公司算法岗位(偏图像算法,制造行业)技术面试考点之AI算法与实际场景结合产生商业价值的头脑风暴

    Interview:算法岗位面试-10.15上午-上海某公司算法岗位(偏图像算法,制造行业)技术面试考点之AI算法与实际场景结合产生商业价值的头脑风暴 导读:一心想去互联网,未必能够发挥自己最大价值, ...

  5. 只更新代码,然后发布版本:基于 Serverless Devs 原子化操作阿里云函数计算

    众所周知,随着时间的发展,Serverless 命令行工具也逐渐的玩出了更多的花样,就目前来看,常见的形态有两种,一种是通过 Yaml 来进行资源的描述,另外一种是纯粹的命令行操作,而不依赖这些内容. ...

  6. 数学建模比赛题型划分、常用算法及其适用场景

    目录 题型划分.常用算法及其适用场景 常见赛题类型 算法体系分类 常用算法分类 数据预处理模型及应用场景 优化类模型及应用场景 优化类模型: 聚类模型及应用场景 评价模型及应用场景 预测类模型及应用场 ...

  7. 机器学习算法工程师面试集锦(更新中)

    机器学习算法工程师面试集锦(更新中) 面试问题汇总 常用的损失函数 介绍交叉验证 特征选择方法 机器学习项目的一般步骤 经验风险最小化与结构风险最小化 训练决策树时的参数是什么 在决策树的节点处分割标 ...

  8. 算法:哈希算法的应用场景

    什么是哈希算法 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值. 一个优秀的哈希算法应该满足下面几个条件: 从哈希值不能 ...

  9. leetcode贪心算法题集锦(持续更新中)

    leetcode贪心算法题集锦 leetcode贪心算法题集锦(持续更新中).python 和C++编写. 文章目录 leetcode贪心算法题集锦 一.贪心算法 1.盛最多水的容器 2.买股票的最佳 ...

最新文章

  1. 【pytorch】torch.mean的使用
  2. zabbix_agent安装(Centos+Ubuntu)
  3. mysql 中间点策略_网易MySQL中间件的负载均衡策略及性能优化
  4. centos7 python3安装numpy_centos下pip3安装numpy
  5. java 导入 注释末班_Eclipse添加注释模板
  6. C# Quartz.Net 定时任务的简单使用
  7. java字典类_Java字典类
  8. mybatis plug 只查id_MyBatis Generator的一个问题引发对插件的修改
  9. c语言为什么运行慢,【图片】今天写几个性能测试,为什么C语言跑得这么慢呢??【c语言吧】_百度贴吧...
  10. 平安银行支付接口 PHP ECSHOP
  11. ActiveMQ下载与安装使用
  12. netperf 学习笔记
  13. 产品和运营区别是什么,别迷惑了。
  14. python计算活了多少天计算器_年龄计算器-实际岁数计算器-周岁计算器-虚岁计算器-生日天数计算-活了多少天计算-虚岁怎么算...
  15. 怎么看计算机内存和独显,电脑独立显卡或集成显卡的显存大小怎么查看?
  16. Centos+Aria2+AriaNg+Trancers更新
  17. Appium 按压元素进行滑动
  18. Zotero配合坚果云Web DAV同步那些坑
  19. 应用调试(三)oops
  20. c++ java setobjectarrayelement_Android jni中数组参数的传递方式

热门文章

  1. PageAdmin Cms如何实现信息的定时发布
  2. Lnux-组-用户管理
  3. OSI七层网络参考模型详解
  4. vijos1196吃糖果游戏
  5. 调试器GDB的基本使用方法
  6. http 升级https
  7. Java集合排序及java集合类详解
  8. Docker学习(五):Docker网络
  9. 带宽与码元的关系_1.简单谈谈码元速率、数据速率、信道带宽、信道容量、载波几个概念...
  10. 码元速率、数据速率、信道带宽、信道容量、载波的概念