Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky…
这句话可以这样理解:思路很简单,细节是魔鬼。

知乎原地址
https://www.zhihu.com/question/36132386/answer/712269942

0 框架

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

其中 … 标记的部分,就是可能出现细节问题的地方,当你见到一个二分查找的代码时,首先注意这几个地方。后文用实例分析这些地方能有什么样的变化。

1 查找一个数

int binarySearch(int[] nums, int target) {int left = 0; int right = nums.length - 1; // 注意while(left <= right) { // 注意int mid = (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;
}

2 查找左边界

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

3 查找右边界

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

魔鬼一样的二分查找模板相关推荐

  1. 二分查找模板及题目汇总

    文章目录 经典二分查找模板 Templete1 Templete2 Templete3 查找第一次出现target的位置 查找最后一次出现target的位置 查找与target最接近的数的位置 第一个 ...

  2. 二分查找模板全面总结

    二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...

  3. 不需要考虑mid+1、mid-1的二分查找模板,希望大家都能学会

    文章目录 一.模板示范 二.模板 三.细节说明 为什么L的初始值为-1,R的初始值为N 为什么循环结束的条件是while(L+1!=R)? 不会陷入死循环 最后 四.     例题one[数的范围]( ...

  4. P1873 砍树(二分查找模板)

    题目描述 伐木工人米尔科需要砍倒 MM 米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林. 米尔科的伐木机工作过程如下:米尔科设置一个高度参数 HH(米 ...

  5. 【二分查找万能模板,告别死循环、告别越界】Leecode 34. 在排序数组中查找元素的第一个和最后一个位置

    题目链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/ 题解汇总: ...

  6. 二分查找及模板——试解《数的范围》

    目录 一.前言 二.二分查找模板 2.1.模板: 三.例题 3.1.数的范围: 四.总结: 4.1.小tips 五.后记 一.前言 晚上好...(哈欠 今天我们来讲什么呢?唔...我们来讲一个二分模板 ...

  7. 漫画:二分解题模板(第一讲)- 修订版

    今天还是小浩算法"365刷题计划"第66天.昨天也是第66天,为什么?因为昨天我的内容忘记标识原创,马上就被人抄袭到了自己的博客,我很不爽!当然,经过投诉,对方已经删文.所以为了防 ...

  8. LeetCode Hot100 ---- 二分查找专题

    什么是二分查找 二分查找是计算机科学中最基本.最有用的算法之一. 它描述了在有序集合中搜索特定值的过程. 二分查找中使用的术语: 目标 Target -- 你要查找的值 索引 Index -- 你要查 ...

  9. [算法][二分查找][排除法]

    最基本的二分查找算法 「搜索区间」是 [left, right] nums[mid] == target 时可以立即返回 int binary_search(int[] nums, int targe ...

最新文章

  1. mysql不等于判断时,空值过滤问题
  2. 代理加盟哪家小程序开发公司好
  3. boost::python::bases相关的测试程序
  4. java test报错_Java 单元测试报错
  5. thymealf如何实现传单个变量给html_梦回2013,看尤大vue的第一行代码,如何用30行代码实现vue(超简洁,适合初学者)...
  6. Spring Cloud文档阅读笔记-初识Spring Cloud(对Spring Cloud初步了解)
  7. DB中字段为null,为空,为空字符串,为空格要怎么过滤取出有效值
  8. 一题多解(五) —— topK(数组中第 k 大/小的数)
  9. UVA515 King
  10. linux命令iconv_linux命令系列之iconv
  11. java 加密压缩文件
  12. 坚果云android功能,Android
  13. 华为又又又白给了,自动化福利领取了吗?
  14. Django 编写您的第一个Django应用
  15. flutter如何让行Row的两个子控件分别左对齐和右对齐?
  16. php程序如何删除文件夹和文件
  17. 水果食用大全 -- 果品食疗 - 杏
  18. 关于移动设备的Flash播放器,Flash平台,和Flash未来的澄清
  19. 爱普生Epson EPL-N3000 打印机驱动
  20. okhttp下载保存图片并更新图库

热门文章

  1. CentOS6.5 安装并配置vsftpd
  2. python os读取文件
  3. php实现无限级分类(递归方法)
  4. hbase1.2.4安装
  5. 通过Docker进程pid获取容器id
  6. redis演练(7) redis Sentinel实现故障转移
  7. 个推如何管理亿级代码的质量?持续集成SonarQube 代码质量管理系统
  8. 【转载】用备份进行Active Directory的灾难重建:Active Directory系列之三
  9. Android 常用开发工具收藏
  10. Kaldi AMI数据集脚本学习5---AMI mono phone文件 40.mdl分析