二分查找定边界(详细解析)
二分查找定边界
学习二分查找的过程中发现经常因为边界定的不正确导致最终结果出错,写篇博客整理一下。以下所有数组都默认是按升序排列的。Leetcode上这篇Binary Search 101总结得非常好。
1、查找数组中特定值出现的位置
查找数组中值为target
的元素,返回其下标。
public static int binarySearch(int[] nums,int target){//寻找数组中target的元素下标,数组升序排列int l=0,r=nums.length-1;while(l<r){//当l=r时区间内只有一个元素,结束循环判断其是否满足即可int m=(l+r)/2;//要避免l或r一直保持不变的情况,比如l=m,m=(l+r),l会一直保持不变if(nums[m]==target){return m;}else if(nums[m]<target){l=m+1;}else{r=m-1;}}if(nums[l]!=target){return -1;//如果找不到}return l;}
Q:循环终止的条件为什么是while(l<r)
而不是while(l<=r)
?
A:当l=r
时区间内只有一个元素,可以结束循环,然后判断区间内的这一个元素是否等于target
即可,如果等于就返回其下标,不满足返回-1
.网上也有人用while(l<=r)
来作为循环结束条件,也是可以的,但代码中的其他部分需要根据这个循环结束条件来进行调整。我更习惯用while(l<r)
来作为循环结束条件。
Q:什么时候m=(l+r)/2
?什么时候m=(l+r+1)/2
?
A:前者是m
向下取整,后者是向上取整。考虑只剩两个元素时,保证l
或r
不要一直不变,导致死循环即可。如果l=m
,m=(l+r)
,那么l
会一直保持不变。举个例子,如果l=2
,r=3
,假设调整边界的时候l=m
,若m=(l+r)/2
,定边界的时候如果落到l=m
,则l=m=2
,相当于l
的值一直是2,m
的值也会一直是2,死循环。要避免这种情况,可以调整边界 ,让m=(l+r+1)/2
。
2、查找数组中特定值第一次出现的位置
查找数组中值为target
元素第一次出现的位置。
public static int binarySearchLeft(int[] nums,int target){//寻找数组中等于target的元素最小下标,数组升序排列int l=0,r=nums.length-1;while(l<r){int m=(l+r)/2;if(nums[m]==target){//要使下标尽可能小,抛弃右半边元素r=m;}else if(nums[m]<target){l=m+1;}else{r=m;}}if(nums[l]!=target){return -1;}return l; }
3、查找数组中特定值最后一次出现的位置
查找数组中值为target
元素最后一次出现的位置。
public static int binarySearchRight(int[] nums,int target){//寻找数组中等于target的元素最大下标,数组升序排列int l=0,r=nums.length-1;while(l<r){int m=(l+r+1)/2;if(nums[m]==target){l=m;}else if(nums[m]<target){l=m;}else{r=m-1;}}if(nums[l]!=target){return -1;}return l; }
4、查找数组中小于等于特定值的元素的最大下标
寻找数组中小于等于target的元素的最大下标。
public static int binarySearchUpper(int[] nums,int target){//寻找数组中小于等于target的元素最大下标,数组升序排列int l=0,r=nums.length-1;while(l<r){int m=(l+r+1)/2;if(nums[m]<=target){l=m;}else{r=m-1;}}if(nums[l]>target){return -1;}return l; }
5、查找数组中大于等于特定值的元素的最小下标
寻找数组中大于等于target
的元素的最小下标。
public static int binarySearchLower(int[] nums,int target){//寻找数组中大于等于target的元素最小下标,数组升序排列int l=0,r=nums.length-1;while(l<r){int m=(l+r)/2;if(nums[m]>=target){r=m;}else{l=m+1;}}if(nums[l]<target){return -1;}return l; }
二分查找定边界(详细解析)相关推荐
- 34. 二分查找左右边界
二分查找框架 int binary_search(int[] nums, int target) {int left = 0, right = nums.length - 1; while(left ...
- 二分查找,超详细解读与代码实现,看完不会取关
必要条件:给定的数组必须有序,否则不适用二分查找.如果传入的数组无序,则要先对其排序,再进行二分,查找.那排序问题可参考其它排序算法.这篇博文的重点是讲二分. 核心思路:二分区间,找到划分的区间中点位 ...
- LeetCode面试刷题技巧-二分查找算法代码思路解析
二分查找的思想 提及二分查找算法,我想大部分人都不陌生,就算不是学计算机的,基本上也都使用过二分查找的思想,不信的话,且听我慢慢为你道来. 不知道你有没有玩过这样一个游戏,猜数字.就是说一个人心里想了 ...
- 二分查找算法代码详细理解
前言 以前写了好多次的二分查找了,但对于一些细节感觉还是没有领悟道,比如while循环里面是否加上等号,mid是否要加一等等,每次写的时候虽然都过了,但总感觉是稀里糊涂的过的,这次特意来深度理解下二分 ...
- 二分查找及查找左、右边界
目录 二分查找 概念: 详细举例: 那么问题来了 实现代码: 查找左右边界: 概念: 举例: 编写思路: 实现代码: 二分查找 概念: 通过将一组"有序"的'组'不断的一分为二的方 ...
- kb-07线段树-12--二分查找区间边界
1 /* 2 hdu4614 3 本题刚开始想能不能记录该区间最前面开始的点,最后面的点,区间空的数量:但是病不行 4 然后线段树的本质是区间操作,所以!这题主要就是区间的空的全放满,只要定出区间的边 ...
- Python 从零实现二分查找,大量动画演示
二分查找(Binary Search),是一种效率较高的查找方法.在面试或算法竞赛中,查找相关的问题最优解通常就是二分查找.特别在现场面试中尤其重要,常用二分查找来考察面试者的编码能力和算法思维. 二 ...
- 2021CSP入门级第一轮认证详细解析
预计阅读时间:10分钟 1.单选题(2分) 以下不属于面向对象程序设计语言的是( ). A.C++ B.Python C.Java D.C 解析:C语言并非面相对对象,而是面向过程. 答案:D 2.单 ...
- 基本的二分查找、寻找第一个和最后一个数的二分查找
二分查找 1 二分查找的框架 2 寻找一个数(基本的二分搜索) 3 寻找左侧边界的二分搜索 4 寻找右侧边界的二分查找 5 合并 二分查找场景:有序数组寻找一个数.寻找左侧边界(有序数组等一个等目标数 ...
最新文章
- [翻译]震荡波蠕虫技术分析(振荡波蠕虫技术分析)
- 分布式文件系统—HDFS—基本介绍
- java工具类下载_java文件下载工具类
- 华为手机怎么设置应用不全屏显示_手机投屏智能电视画面比例不合适怎么办?...
- 旷视南京研究院2020年校招开启!
- 华为浏览器:即日起全面清理违规信息 严管“自媒体”账号
- 没钱没资本可以创业不,想创业的人怎么办
- 设置自动清理mysql binlog日志和手动删除的方法
- 2019: 属于BERT预训练语言模型之年
- 调用支付jsapi缺少参数:appid_JAVA实现微信支付功能
- android+嵌入地图,Android 给app加入百度地图
- 资源篇(一)-在线抠图神器
- windet插入图片的大小_LaTeX图片插入
- 【车间调度】基于matlab改进的帝国企鹅算法求解车间调度问题【含Matlab源码 2041期】
- cpu 关闭nx_AMD夺取武林盟主宝座(2020年1月CPU天梯图)
- linux 驱动笔记(一)
- 利用PHPExcel转Excel饼图
- windows录屏_Windows电脑怎么录制屏幕?查看电脑自动录屏方法
- 实践Python控制NI SMU PXIe-4143
- Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系
热门文章
- PyQt6案例3:简单计算器案例
- 2022年真无线蓝牙耳机有哪些推荐?学生平价蓝牙耳机推荐
- Ubuntu使用OneDrive记录:更换账户或修改密码之后重新登
- 浙江七选三计算机专业分数,浙江7选3赋分规则新变化,一分一赋已出细则
- 敏之澳电商:拼多多店群到底怎么做呢?
- node.js http-server虽然启动了,但是网页打开显示无法正常运作解决办法
- 公司sns JSSDK组件列表-20131011
- 对中文的拼音操作PinyinUtils
- Angular + Leaflet 实现房源数据可视化(附github源码)
- 自己开发的App在华为荣耀系列手机上安装失败,“未包含任何证书”