经典算法----折半查找

二、经典算法之折半查找

很多同学对于二分法就是:一看就会,一写就废!!!!
在这里插入图片描述

易错点1:以下循环方式写哪一个?

方案一:while(left<right)
方案二:while(left<=right)

易错点2:如果arr[mid]<target,以下赋值该选哪一个(左半边同理)

方案一:right = mid;
方案二:right = mid - 1;

二、循环不变量

关于我们在while()循环当中所要搜素的数据我们将其分为以下四种

①:左闭右闭 [left,right]

在这里插入图片描述
体现在代码上就是

while(left<=right)

②:左闭右开 [left,right)

在这里插入图片描述
体现在代码上就是

while(left<right)

③:左开右闭 (left,right]

④:左开右开 (left,right)

后两种一般不做讨论,因为在实际的案例或者大型开源项目当中,所采用的的规则一般是前两种。
我们在while循环当中要坚持对区间的定义,这样才能更好的把控好易错点2当中所提出的问题,我们才能对边界做出一个理性的分析。而不是背写来…
同学们之所以会出现错误,最大原因在于没有坚持好 循环不变量这个原则,比如我们在while循环当中选择了左闭右闭,但是在操作过程当中却编程了左闭右开或者其他的什么…

三、左闭右闭 [left,right]的写法

重点解释:为什是是 right = mid -1; left=mid+1;
在这里插入图片描述
**举反例:**以下数据和目标值
在这里插入图片描述

如果我们采用的是 左闭右闭的写法,并且使用 left = mid 和 righ = mid;
第一轮:mid = 3:target<arr[mid];rigt指向mid的位置。
第二轮:mid = 0;target>arr[mid];left执行mid的位置。
第三轮:mid = 0;target>arr[mid];left执行mid的位置。
第四轮:mid = 0;target>arr[mid];left执行mid的位置。
......死循环
 public int search(int[] nums, int target) {int left = 0;int right = nums.length-1;while(left<=right){int mid = (left + right) / 2;if(nums[mid]<target){left = mid + 1;}else if(nums[mid]>target){right = mid - 1;}else if(nums[mid] == target){return mid;}else{return -1;}}   return -1;
}

四、左闭右开 [left,right)的写法

重点解释:为什是是 right = mid;和 left = mid+1;
在这里插入图片描述
举反例:
在这里插入图片描述

如果我们采用的是 左闭右开的写法,并且使用 left = mid+1 和 righ = mid - 1;
第一轮:left < right; mid = 3; target<nums[mid];:right指向了数值0的位置.....
第二轮:left < right; mid = -1; target<nums[mid];:right直接出界.....
 int left = 0;int right = nums.length; //定义右游标,这个地方要注意int mid = 0;while(left<right){mid = (left + right) / 2;if(nums[mid]<target){left = mid+1;}else if(nums[mid]>target){right = mid;}else if(nums[mid]==target){return mid;}else{return -1;}
}

总结

我们需要注意:
闭区间: 既然我们已将判断了arr[mid]<targrt或者arr[mid]>targrt,我们指针指向哪里哪里就是我们实际的索引区域,所以出现: left = mid + 1; right = mid-1;
开区间: 既然我们已将判断了arr[mid]<targrt或者arr[mid]>targrt,我们指针指向哪里哪里的下一位就是我们实际的索引区域,所以出现: left = mid; right = mid;

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

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

相关文章

【MATLAB】兔子机器人总系统_动力学模型解读(及simulink中的simscape的各模块介绍)

1、动力学模型 Rectangular Joint 控制平面上&#xff08;x&#xff0c;y轴&#xff09;的移动&#xff0c;去掉以后&#xff0c;机器人在原地翻滚不移动 Rigid Transform 坐标转换&#xff0c;B站视频已收藏 去掉&#xff0c;机体与地面贴合 此处的作用是设定机体的初…

网站建设:承诺网站打开速度,这个要求合理吗?

很多甲方都要求网站的打开速度&#xff0c;这个要求合理吗&#xff1f;其实说合理也合理&#xff0c;说不合理也不合理。 承诺打开速度的合理性的一面 要求网站打开速度是一个合理的要求。网站的打开速度对于用户体验和网站的成功至关重要。以下是一些原因说明为什么网站打开速…

设计模式(一)设计模式分类和六大设计原则

0.设计模式的分类 GoF提出的设计模式总共有23种&#xff0c;根据目的准则分类分为三大类&#xff1a; 创建型模式&#xff0c;共五种&#xff1a;单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 结构型模式&#xff0c;共七种&#xff1a;适配器模式、装饰模式…

计算字符串的长度

在R语言中&#xff0c;你可以使用nchar()函数来计算字符串的长度。这个函数返回的是字符串中的字符数&#xff0c;而不是字节数。 例如&#xff0c;如果你有一个字符串str <- "Hello, World!"&#xff0c;你可以使用nchar(str)来获取它的长度。 代码如下&#x…

windows 两个服务器远程文件夹同步,支持文件新增文件同步、修改文件同步、删除文件同步 python脚本(通过对比文件hash值确认文件是否备修改)

在Python中实现Windows两个服务器之间的文件夹同步&#xff0c;可以通过计算并对比文件的哈希值来判断文件是否被修改过。这里我们使用paramiko进行远程操作&#xff0c;并结合hashlib库计算MD5哈希值&#xff1a; import os import paramiko import hashlib# 定义源与目标服务…

2023年全国职业院校技能大赛 GZ073网络系统管理赛项 模块A:网络构建

2023年全国职业院校技能大赛 GZ073网络系统管理赛项 模块A:网络构建 卷II 一. 拓扑图 二.有线网络配置 三.无线网络配置 四.出口网络配置 二、有线配置 S1.txt S1#show running-config Building configuration... Current configuration : 5008 bytes! version RGOS 10…

[OpenWrt 22.03] ttylogin添加登录密码与禁止登录的配置

ttylogin 的使用 Openwrt 串口默认是没有密码的。Openwrt启动后,一个默认的密码将被启用去保护ssh登录和页面(http)登录,而串口登录密码却是空缺的。 对于 Openwrt,当内核初始化后,就会启动第一个进程 init,init进程会进行一系列的系统初始化工作,然后会读取 /etc/in…

微服务系列(一)springcloudAlibaba之Nacos注册和配置中心及openFeign远程调用

一&#xff0c;认识微服务 我们先看看开发大型项目采用单体架构存在哪些问题&#xff0c;而微服务架构又是如何解决这些问题的。 1.1 单体架构 单体架构&#xff08;monolithic structure&#xff09;&#xff1a;整个项目中所有功能模块都在一个工程中开发&#xff1b;项目部署…

大数据安全问题有哪些类型

在物联网时代&#xff0c;数据已成为公司的重要资产。公司使用大数据等现代技术来收集和处理数据。凭借这些能力&#xff0c;大数据已经 改变了许多行业&#xff0c;例如医疗保健、零售和农业。大数据应用有助于公司改善业务运营并预测行业趋势。然而&#xff0c;这项技术可能 …

for与while的区别

for循环中&#xff0c;知道循环次数或者循环范围 while循环中&#xff0c;不知道循环的范围和次数&#xff0c;只知道循环的结束条件 。。。 /*山峰的高度是&#xff08;8844.43米8844430毫米&#xff09;&#xff0c;假如我有一张纸&#xff0c;要折多少次可以达到山峰的高…

【递归搜索回溯专栏】专题一递归:快速幂

本专栏内容为&#xff1a;递归&#xff0c;搜索与回溯算法专栏。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;递归搜索回溯专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

为HTTP而生的requests库,纵横江湖难逢敌手

目录 requests是什么安装requests使用requestsGET方法POST方法 requests的相关函数 既然Python是一门全球流行的语言&#xff0c;那么对于网络通信的HTTP的支持肯定也是非常的优秀的。Python中原生的urllib模块也有对HTTP的支持&#xff0c;虽然也可以用来发送 HTTP 请求&#…

Android开发新手入门教程,华为大神花费5个月打造的这份714页学习笔记系列

前言 成为一个专业人士是所有程序员的目标&#xff0c;近几年的工作经历&#xff0c;近距离观察了很多大公司的大佬。有幸与其中的一部分一起工作。在此分享大牛程序员的行为风格以及我自己的所思所想&#xff0c;希望对大家有所帮助。 特此声明&#xff1a;此为我个人主观观点…

SpringCloud-Hystrix熔断降级和监控

写得比较全的可以参考这篇文章&#xff1a;微服务——Hystrix的使用_hystrix使用-CSDN博客 Hystrix的主要功能包括&#xff1a; 熔断器&#xff08;Circuit Breaker&#xff09;&#xff1a;通过监控对远程服务的调用&#xff0c;当远程服务出现问题导致失败率过高时&#xff…

python基础第二天

世界杯小组赛成绩 注意&#xff1a; 1.循环 1.1while 1.2for 1.3 range 1.4 while else while 循环正常执行完才能执行else语句

【Linux】磁盘情况、挂载,df -h无法看到的卷

文章目录 解决挂载、解决挂载完重启就消失1、查看linux下的硬盘挂载的空间、使用空间2、查看没有挂载的硬盘是否检测在系统中3、挂载 &#xff08;挂载完&#xff0c;要在/etc/fstab 下面配置挂载信息 要不然重启挂载就消失了&#xff09; 解决挂载、解决挂载完重启就消失 linu…

【C++通关攻略 · 基础篇】注释

✍作者&#xff1a;黑洞极客 &#x1f4d4;专栏&#xff1a;C&#xff1a;通关攻略 本篇文章将介绍 C 中的注释&#xff0c;有帮助的话别忘点赞收藏&#xff0c;关注专栏哦&#xff01; 注释 注释&#xff0c;是程序中的解释型语言&#xff0c;可以提高程序的可读性。在程序中使…

推荐一款桌面端redis连接工具, redis desktop manager替代品——another redis desktop manager

下载地址 Another Redis Desktop Manager | 更快、更好、更稳定的Redis桌面(GUI)管理客户端&#xff0c;兼容Windows、Mac、Linux&#xff0c;性能出众&#xff0c;轻松加载海量键值 封面对比 对比redis desktop manager &#xff0c;ui上有巨大的改进 但是redis desktop ma…

华为OD机试“HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序”Java编程解答

描述 输入整型数组和排序标识&#xff0c;对其元素按照升序或降序进行排序 数据范围&#xff1a; 1≤n≤1000 &#xff0c;元素大小满足 0≤val≤100000 输入描述&#xff1a; 第一行输入数组元素个数 第二行输入待排序的数组&#xff0c;每个数用空格隔开 第三行输入一…

授权认证登录之 Cookie、Session、Token、JWT 详解

授权认证登录之 Cookie、Session、Token、JWT 详解 一、先了解几个基础概念什么是认证&#xff08;Authentication&#xff09;什么是授权&#xff08;Authorization&#xff09;什么是凭证&#xff08;Credentials&#xff09; 二、Cookie1、了解 Cookie2、cooker的创建2、coo…