二分查找的总结

news2024/10/7 12:17:43

一、二分查找

在这里插入图片描述

1.思路分析

  这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。

  二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是 while(left < right) 还是 while(left <= right),到底是right = middle呢,还是要right = middle - 1呢?

  大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

2.解法

(1)第一种

第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] 。区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:
1.while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
2.if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1。
例如在数组:1,2,3,4,7,9,10中查找元素2,如图所示:
在这里插入图片描述
C++


C


(2)第二种

如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。

有如下两点:
1.while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
2.if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
在数组:1,2,3,4,7,9,10中查找元素2,如图所示:(注意和方法一的区别)
在这里插入图片描述
C++


C


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

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

相关文章

Ampere Computing 发布全新 AmpereOne 系列处理器,192 个自研核

2023 年 5 月 19 日&#xff0c;中国北京——Ampere Computing 宣布推出全新 AmpereOne™ 系列处理器&#xff0c;该处理器拥有多达 192 个单线程 Ampere 核&#xff0c;内核数量为业界最高。这是第一款基于 Ampere 新自研核的产品&#xff0c;由 Ampere 自有 IP 全新打造。 致…

chatgpt赋能Python-python3_6怎么打开

Python 3.6&#xff1a;新时代的编程语言 Python 3.6是一种全新的编程语言版本&#xff0c;它提供了全新的功能和改进&#xff0c;使得编程过程更加简便且实用。无论你是编程新手还是老手&#xff0c;本文将教你如何打开Python 3.6&#xff0c;并带你了解Python 3.6的优点。 …

详解c++---多态

目录标题 为什么会有多态什么是虚函数的重写多态的定义特殊的重写重载&#xff0c;覆盖&#xff08;重写&#xff09;&#xff0c;隐藏&#xff08;重定义&#xff09;的对比final和override抽象类多态的原理验证虚表所在额度位置多继承的多态原理菱形虚拟继承多态的一些小点 为…

登录ChatGPT时提示Sorry, you have been blocked(对不起,您已被阻止)

问题描述 今天想使用ChatGPT&#xff0c;结果突然来了这么个问题&#xff0c;就问你吓不吓人&#xff1f;&#xff1f;&#xff1f;我以为我的账号被封了&#xff01; 原因分析 内容过滤&#xff1a;某些平台或网站可能使用内容过滤系统&#xff0c;该系统可能将AI语言模型视…

全文索引搜索引擎Zinc

什么是 Zinc &#xff1f; ZincSearch 是一个搜索引擎&#xff0c;可用于文本数据、日志、指标、事件等。它允许您进行全文搜索&#xff0c;包括将服务器日志发送到 ZincSearch、推送您的应用程序数据、提供全文搜索或在您的应用程序中构建搜索栏。具备与 Elasticsearch API 的…

Android WebView加载网页html文件显示加载进度

效果图如下&#xff1a; 一、视图绑定 通过视图绑定功能&#xff0c;您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后&#xff0c;系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。 在大…

Navicat 15中文安装教程

Navicat 15中文安装教程 附上百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1OZNjcuEHnsZqBa9A-e_twQ 提取码&#xff1a;2phg 里面有两个版本&#xff0c;分别是64位和32位&#xff0c;大家可以根据自己的情况进行安装 下面是详细安装教程 1、选择安装包…

Sonar加入jenkins流水线

前提&#xff1a;已搭建sonarqube 1、配置sonarqube server jenkins 中manage jenkins-configure System配置sonarqube server 2、准备sonar环境 在jenkins项目的构建环境步骤中&#xff0c;勾选prepare SonarQube environment token需要提前在凭据里添加一个token 3、执行s…

ES6中flat与flatMap使用

1、方法介绍 数组的成员有时还是数组&#xff0c;Array.prototype.flat()用于将嵌套的数组“拉平”&#xff0c;变成一维的数组。该方法返回一个新数组&#xff0c;对原数据没有影响。 [1, 2, [3, 4]].flat() // [1, 2, 3, 4]上面代码中&#xff0c;原数组的成员里面有一个数…

InnoDB数据页结构

什么是页&#xff1f;什么是数据页&#xff1f; 页是InnoDB管理存储空间的基本单元&#xff0c;一个页的大小一般是16k。 InnoDB有许多不同的页&#xff0c;有存放表空间头部信息的页&#xff0c;INODE信息的页&#xff0c;当然还有存放我们记录信息的页&#xff0c;这个页叫…

【苹果】Apple Store 更换ID教程

在此之前需要准备的项目&#xff1a; 一台苹果手机【教程环境&#xff1a;ios15 in iPhone11】一个新的苹果ID账号一个具备完整阅读能力愿意看完教程的人 教程开始 第一步&#xff1a;解锁您的 iPhone 第二步&#xff1a;打开你的应用商店 第三步&#xff1a;点击右上角头像…

Linux驱动快速入门(vscode的使用)

vscode精确跳转前提&#xff1a; 1、安装了clangd插件 2、禁止了c/c intellisense&#xff1a; 3、在Linux内核源码首目录下有compile_commands.json文件&#xff0c;且这个文件内容“cc”改为了“xxxx-gcc”&#xff0c;后先清理之前编译的&#xff0c;后用bear make编译。…

ChatGPT官方APP上线:速度极快且免费、增加语音识别,网友:真香

安卓版也马上要来。 很强大&#xff0c;很简洁&#xff0c;而且它太快了。 这就是人们对几小时前 OpenAI 发布的 ChatGPT 官方版 App 的评价&#xff1a; ChatGPT 推出近半年以来&#xff0c;已经从新鲜的事物成为改变整个科技领域的推手。有机构统计认为&#xff0c;早在今年…

【手撕代码系列】JS手写实现深拷贝

公众号&#xff1a;Code程序人生&#xff0c;分享前端所见所闻 深拷贝是在计算机科学中非常重要的概念&#xff0c;尤其是在处理数据结构和对象的时候。深拷贝的目的是创建一个新的对象&#xff0c;它有自己的内存空间&#xff0c;并且其中的所有值都是原始对象的副本。这样做的…

某大型啤酒企业:CACTER邮件网关成功替换IronPort!安全防护升级

客户案例 某大型啤酒厂商的公司规模和市场份额多年来始终都处于行业领先地位&#xff0c;积极赞助多项体育赛事&#xff0c;持续丰富和提升品牌形象。 作为一家具有全球影响力的企业&#xff0c;自然也成为了全球黑客等攻击团伙的重点目标&#xff0c;而系统攻击的开端便是钓…

互联网医院牌照的申请流程|互联网医院资质申请难吗

互联网医院系统现在已经发展的很成熟了&#xff0c;国家也出台了很多鼓励的相关政策&#xff0c;所以很多的医疗机构也纷纷的开始开发互联网医院系统&#xff0c;当然要想互联网医院系统能够正常的运行看诊&#xff0c;还需要申办互联网医院牌照&#xff0c;接下来给大家介绍一…

GE Hydran M2 监测各种故障气体的综合值

Hydran M2 是一种紧凑型永久安装在线变压器监测设备&#xff0c;可在出现故障情况时向人员发出警报。它持续监测各种故障气体的综合值&#xff08;以 ppm 为单位&#xff09;或仅监测氢气值&#xff08;取决于购买的传感器&#xff09;。此外&#xff0c;它还跟踪油中的水分&am…

Redis自学之路—基础数据结构(二)

目录 简介 Redis应用场景 Redis基础数据结构 一、string&#xff08;字符串&#xff09; string类型相关指令 二、list&#xff08;列表&#xff09; list类型相关指令 三、hash&#xff08;字典&#xff09; hash类型相关指令 四、set&#xff08;集合&#xff09; se…

Mysql多表和窗口函数

1.多表查询--自关联查询 # 格式: select * from A join A on 条件; 或者 select * from A left join A on 条件; # 自关联查询的用法和 内连接, 外连接等操作一模一样, 只不过是: 表自己关联自己. # 应用场景: 分类表(多级), 行政区域表(3级, 省市区). # 查询结果: 跟上述多…

一起来学shiny把(2)—-shiny页面布局

什么是shiny&#xff1f;Shiny是一个R包&#xff0c;可让您轻松地直接从 R 构建交互式 Web 应用程序&#xff08;应用程序&#xff09;。本系列是个长教程&#xff0c;带你由浅入深学习shiny。 上一节我们在文章《R语言系列教程—–一起来学shiny吧&#xff08;1&#xff09;》…