二分搜索算法

二分搜索算法

二分搜索

对于一组有顺序的数据,不采用常见的遍历方式找到需要的数据,而是利用其规律,比中间数据小的一定在中间数据左边,比中间数据大的一定在中间数据右边,每次排除一般的数据,从而提高搜索算法的时间复杂度。

模板

这里确保目标数据一定存在于数组当中

public int binarySearch(int[] nums, int target) {int left = 0, right = nums.length - 1;// 确定取值范围while (left < right) {int mid = left + (right - left) / 2;// 确定中间值int num = nums[mid];if (num > target) {// 缩小区间范围right = mid - 1;} else if (num < target) {left = mid + 1;} else {return mid;}}return left;}
注意点
1、取值范围确定

这道题由于数据一定存在于数组当中,所以其下标的取值一定是0~数组长度-1,所以我们将left = 0,right = nums.length - 1,其他的题目也是相同的道理。

2、mid中间值确定

有人说mid中间值可以直接使用**(left + right) / 2得到,确实是这样,但是当left和right的值特别大的时候,可能导致两者相加超出int类型或者其他数值类型的取值范围,所以建议还是采用left + (right - left) / 2这种方式获取mid中间值较为安全。但是并不一定每一获取中间值都是left + (right - left) / 2**,还有可能是left + (right - left + 1) / 2这种情况,这需要在第三步完成之后才能判断出来,用于解决跳不出循环的问题。

3、如何缩小区间范围

对于这道题如果mid取值比目标值target小,那么一定在其右边left = mid + 1,反之则是一定在其左边right = mid - 1,这种情况下并不存在跳不出循环的问题,mid中间值确定的两种方式都可。但是如果是这道题35. 搜索插入位置 - 力扣(LeetCode)就需要注意一下,由于目标值可能不存在,如果mid取值比目标值target小,那么一定在其右边left = mid + 1,但是如果比目标值大,那么就可能是mid位置,也有可能是在mid左边,于是right = mid,此时mid中间值的计算方式为left + (right - left) / 2,那是因为假设此时left = 0,right = 1,nums[left] = 0,nums[right] = 2,target = 1,这时mid = 0 + (1 - 0) / 2 = 0,这时的结果就为1。但是如果mid = 0 + (1 - 0 + 1) / 2 = 1,那么则会一直重复right = 1这个操作,从而导致循环无法结束。所以通俗的来讲,mid中间值的确定在于left = mid还是right = mid,如果是left = mid,那么mid = left + (right - left + 1) / 2,如果right = mid,那么mid = left + (right - left) / 2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法基础】数学知识

质数 质数的判定 866. 试除法判定质数 - AcWing题库 时间复杂度是logN #include<bits/stdc.h> using namespace std; int n; bool isprime(int x) {if(x<2) return false;for(int i2;i<x/i;i){if(x%i0) return false;}return true; } signed main() {cin>&g…

SpringBoot+MyBatisPlus+MySQL不能储存(保存)emoji表情问题解决

1.之前在学习过程中不知道utf8和utf8mb4的区别&#xff0c;也没过多去了解&#xff0c;直到最近设置的数据库编码全是utf8后发现问题所在了&#xff0c;居然不能储存表情包&#xff01;&#xff01;&#xff01;整个人直接傻了&#xff0c;后面知道了utf8是3字节不能储存表情&a…

【MTK】【WFD】手机投屏到投影仪不显示画面

问题分析: 在投屏过程中,有时候会出现WFD sink端回复的video 格式表不正确,sink表示是支持VESA(3fffffff),但是当手机根据协商结果得到最优分辨率并发送给sink端时,sink端看上去没有正常播放,其实实际上应该是不支持的。 比如我们这个问题就是CES表中的0001ffff,最大…

SadTalker 让图片说话

参考&#xff1a;https://github.com/OpenTalker/SadTalker 其他类似参考&#xff1a;https://www.d-id.com/ 输入图片加音频产生2d视频 安装使用 1、拉取github&#xff0c;下载对应安装库 2、下载对应模型baidu网盘 新建checkpoints&#xff0c;把下载sadtalker里模型拷贝进…

层次查询和分析函数(LAG、LEAD)在号段选取中的应用

1. 问题的提出 在实际工作中&#xff0c;我们常常会碰到号段选取的问题&#xff0c;例如&#xff1a; 一组连续的数&#xff0c;去掉中间一些数&#xff0c;要求出剩下的数的区间&#xff08;即号段&#xff09;例如&#xff1a;一串数字为1,2,3,4,7,9,10&#xff0c;则号段为…

如何在Gazebo中实现多机器人编队仿真

文章目录 前言一、仿真前的配置二、实现步骤1.检查PC和台式机是否通讯成功2.编队中对单个机器人进行独立的控制3、对机器人进行编队控制 前言 实现在gazebo仿真环境中添加多个机器人后&#xff0c;接下来进行编队控制&#xff0c;对具体的实现过程进行记录。 一、仿真前的配置…

JAVAEE初阶相关内容第十二弹--多线程(进阶)

目录 一、JUC的常见类 1、Callable接口 1.1callable与runnable 1.2代码实例 &#xff08;1&#xff09;不使用Callable实现 &#xff08;2&#xff09;使用Callable实现 1.3理解Callable 1.4理解FutureTask 2、ReentrantLock 2.1ReentrantLock的用法 2.2ReentrantLoc…

【面试题】Js数组去重都有哪些方法?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 1. indexOf 定义&#xff1a; indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置…

springboot整合sentinel完成限流

1、直入正题&#xff0c;下载sentinel的jar包 1.1 直接到Sentinel官网里的releases下即可下载最新版本&#xff0c;Sentinel官方下载地址&#xff0c;直接下载jar包即可。不过慢&#xff0c;可能下载不下来 1.2 可以去gitee去下载jar包 1.3 下载完成后&#xff0c;进行打包…

【办公小神器】:快速批量转换Word、Excel、PPT为PDF脚本!

文章目录 ✨哔哩吧啦✨脚本使用教程✨温馨小提示设置&#x1f4da;资源领取 专栏Python零基础入门篇&#x1f525;Python网络蜘蛛&#x1f525;Python数据分析Django基础入门宝典&#x1f525;小玩意儿&#x1f525;Web前端学习tkinter学习笔记Excel自动化处理 ✨哔哩吧啦 前…

[pai-diffusion]pai的easynlp的clip模型训练

EasyNLP带你玩转CLIP图文检索 - 知乎作者&#xff1a;熊兮、章捷、岑鸣、临在导读随着自媒体的不断发展&#xff0c;多种模态数据例如图像、文本、语音、视频等不断增长&#xff0c;创造了互联网上丰富多彩的世界。为了准确建模用户的多模态内容&#xff0c;跨模态检索是跨模态…

Ctfshow web入门 代码审计篇 web301-web310 详细题解 全

CTFshow 代码审计 web301 下载的附件的目录结构如下&#xff1a; 开题后界面&#xff0c;看见输入框&#xff0c;感觉是sql。 大概浏览一遍源码&#xff0c;我们可以发现在checklogin.php文件中有无过滤的SQL语句&#xff0c;SQL注入没得跑了。 这题SQL注入有三种做法。 方法一…

Linux:GlusterFS 集群

GlusterFS介绍 1&#xff09;Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端.在传统的解决 方案中Glusterfs能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储. 2&#xff09;Glusterfs通过TCP/IP或InfiniBand RDMA网络链…

Everything + Cpolar,打造在线搜索的终极神器

文章目录 前言1. 下载安装注册cpolar2. Everything安装和设置2.1 进入Everything官网进行下载2.2 对Everything文件进行设定 3. 创建cpolar内网穿透隧道4. 公网访问测试Everything5. 固定连接公网地址 前言 你还在用Windows资源管理器自带的搜索工具来搜索文件吗&#xff1f;这…

企业为什么要进行敏捷?敏捷有哪些好处以及敏捷工具

敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。 那企业为什么要进行变革&#xff0c;实施敏捷开发呢&#xff1f; 企业进行敏捷开发的原因主要有以下几点&#xff1a; 1、拥抱变化 敏捷开发的一个重要特点是能够快速响应和适应市场环境的变化。在竞争激烈的市场环境中…

轮换对称性

二重积分 普通对称性–D关于 y x yx yx对称&#xff1a; ∬ D f ( x , y ) d σ { 2 ∬ D 1 f ( x , y ) d σ f ( x , y ) f ( y , x ) 0 f ( x , y ) − f ( y , x ) \iint_{D}f(x,y)d\sigma\begin{cases} 2\iint_{D_1}f(x,y)d\sigma\ \ \ \ \ \ f(x,y)f(y,x) \\ 0 \ \…

OpenStack创建云主机并连接CRT

文章目录 OpenStackT版创建云主机并连接CRT命令行操作&#xff08;1&#xff09;创建镜像&#xff08;2&#xff09;创建实例&#xff08;3&#xff09;创建网络创建内网创建外网 &#xff08;4&#xff09;创建安全组&#xff08;5&#xff09;创建路由&#xff08;6&#xff…

1952-2018年中国各省份人均GDP数据(消涨处理)

1952-2018年中国各省份人均GDP数据&#xff08;消涨处理&#xff09; 1、时间&#xff1a;1952-2018年 2、范围&#xff1a;30省市 3、指标&#xff1a;人均GDP 4、来源&#xff1a;《新中国60周年统计汇编》和各省年鉴 5、指标解释&#xff1a; 过程为环比人均GDP指数转…

YSA Toon (Anime/Toon Shader)

这是一个Toon着色器/Cel阴影着色器,用于Unity URP 此着色器的目的是使角色或物体阴影实时看起来尽可能接近真实的动画或卡通效果 可以用于游戏,渲染,插图等 着色器特性,如:面的法线平滑、轮廓修复、先进的边缘照明、镜面照明、完全平滑控制 这个文档包括所有的功能https:/…

Eclipse ABAP ADT 集成详细安装教程

最近看到网上有个源码使用CDS做的&#xff0c;然后看了一下原来还可以用eclipse&#xff0c;趁热打铁&#xff0c;试了一把&#xff0c;最后成功了&#xff0c;中间可能会有一些报错&#xff0c;可以自己慢慢解决&#xff0c;大概就是这样的。 SAP的开发&#xff0c;有三种开发…