魔鬼一样的二分查找模板
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; // 注意
}
魔鬼一样的二分查找模板相关推荐
- 二分查找模板及题目汇总
文章目录 经典二分查找模板 Templete1 Templete2 Templete3 查找第一次出现target的位置 查找最后一次出现target的位置 查找与target最接近的数的位置 第一个 ...
- 二分查找模板全面总结
二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...
- 不需要考虑mid+1、mid-1的二分查找模板,希望大家都能学会
文章目录 一.模板示范 二.模板 三.细节说明 为什么L的初始值为-1,R的初始值为N 为什么循环结束的条件是while(L+1!=R)? 不会陷入死循环 最后 四. 例题one[数的范围]( ...
- P1873 砍树(二分查找模板)
题目描述 伐木工人米尔科需要砍倒 MM 米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林. 米尔科的伐木机工作过程如下:米尔科设置一个高度参数 HH(米 ...
- 【二分查找万能模板,告别死循环、告别越界】Leecode 34. 在排序数组中查找元素的第一个和最后一个位置
题目链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/ 题解汇总: ...
- 二分查找及模板——试解《数的范围》
目录 一.前言 二.二分查找模板 2.1.模板: 三.例题 3.1.数的范围: 四.总结: 4.1.小tips 五.后记 一.前言 晚上好...(哈欠 今天我们来讲什么呢?唔...我们来讲一个二分模板 ...
- 漫画:二分解题模板(第一讲)- 修订版
今天还是小浩算法"365刷题计划"第66天.昨天也是第66天,为什么?因为昨天我的内容忘记标识原创,马上就被人抄袭到了自己的博客,我很不爽!当然,经过投诉,对方已经删文.所以为了防 ...
- LeetCode Hot100 ---- 二分查找专题
什么是二分查找 二分查找是计算机科学中最基本.最有用的算法之一. 它描述了在有序集合中搜索特定值的过程. 二分查找中使用的术语: 目标 Target -- 你要查找的值 索引 Index -- 你要查 ...
- [算法][二分查找][排除法]
最基本的二分查找算法 「搜索区间」是 [left, right] nums[mid] == target 时可以立即返回 int binary_search(int[] nums, int targe ...
最新文章
- mysql不等于判断时,空值过滤问题
- 代理加盟哪家小程序开发公司好
- boost::python::bases相关的测试程序
- java test报错_Java 单元测试报错
- thymealf如何实现传单个变量给html_梦回2013,看尤大vue的第一行代码,如何用30行代码实现vue(超简洁,适合初学者)...
- Spring Cloud文档阅读笔记-初识Spring Cloud(对Spring Cloud初步了解)
- DB中字段为null,为空,为空字符串,为空格要怎么过滤取出有效值
- 一题多解(五) —— topK(数组中第 k 大/小的数)
- UVA515 King
- linux命令iconv_linux命令系列之iconv
- java 加密压缩文件
- 坚果云android功能,Android
- 华为又又又白给了,自动化福利领取了吗?
- Django 编写您的第一个Django应用
- flutter如何让行Row的两个子控件分别左对齐和右对齐?
- php程序如何删除文件夹和文件
- 水果食用大全 -- 果品食疗 - 杏
- 关于移动设备的Flash播放器,Flash平台,和Flash未来的澄清
- 爱普生Epson EPL-N3000 打印机驱动
- okhttp下载保存图片并更新图库
热门文章
- CentOS6.5 安装并配置vsftpd
- python os读取文件
- php实现无限级分类(递归方法)
- hbase1.2.4安装
- 通过Docker进程pid获取容器id
- redis演练(7) redis Sentinel实现故障转移
- 个推如何管理亿级代码的质量?持续集成SonarQube 代码质量管理系统
- 【转载】用备份进行Active Directory的灾难重建:Active Directory系列之三
- Android 常用开发工具收藏
- Kaldi AMI数据集脚本学习5---AMI mono phone文件 40.mdl分析