82.二分查找

目录

什么是二分查找

 一、左闭右闭写法[left,right]

 代码演示:

二、左闭右开写法[left,right] 

代码演示: 


今天进行了二分查找的学习。 

什么是二分查找

二分查找(Binary Search)是一种常用的搜索算法,也被称为折半查找。它用于在已排序的数组中查找特定元素的位置,通过反复将待查找范围缩小为一半来提高效率。

以下是二分查找的一般步骤:

  1. 确定搜索范围:首先,确定要搜索的数组的起始和结束位置。通常,这是整个数组的起始和结束。

  2. 计算中间位置:计算中间位置的索引,即 (start + end) / 2。

  3. 比较中间元素:将要查找的元素与中间位置的元素进行比较。

    • 如果要查找的元素等于中间位置的元素,那么找到了目标,返回中间位置的索引。
    • 如果要查找的元素小于中间位置的元素,那么说明目标在左半部分,将搜索范围缩小为左半部分。
    • 如果要查找的元素大于中间位置的元素,那么说明目标在右半部分,将搜索范围缩小为右半部分。
  4. 重复步骤2和步骤3,直到找到目标元素或搜索范围为空。如果搜索范围为空,说明目标元素不在数组中。

二分查找的时间复杂度为O(log n),其中n是数组的长度。这是因为每次迭代都将搜索范围缩小为一半,所以在最坏情况下,需要进行log n次迭代才能找到目标元素。

二分查找通常用于已排序的数组,例如升序排列的整数数组或字母表中的单词。它是一种高效的查找算法,适用于大型数据集。

 一、左闭右闭写法[left,right]

定义target是在区间[left,right]里面的,所以有如下两点:middle=(left+right)/2;

  • while( left <= right ),应该使用<=,因为是一个左闭右闭的区间。例:[1,1],此时while循环应当用<=.
  • if( nums[middle] > target ),此时right应该赋值为middle-1;因为当前这个nums[middle]⼀定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1

 代码演示:

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;                 // 定义左边界int right = nums.size() - 1;  // 定义右边界while (left <= right) {int middle = left + (right - left) / 2;  // 计算中间位置,避免整数溢出if (nums[middle] == target) {return middle;  // 找到目标,返回索引} else if (nums[middle] > target) {right = middle - 1;  // 目标在左半部分,更新右边界} else {left = middle + 1;  // 目标在右半部分,更新左边界}}return -1;  // 如果未找到目标元素}
};

        在计算中间位置时,一种最直观的方法是使用 (left + right) / 2。然而,这种方式在极端情况下,当 leftright 很大时,可能会导致整数溢出问题,这会导致程序错误。

为了避免整数溢出,我们使用了 (right - left) / 2,而不是 (left + right) / 2 来计算中间位置。这样做的原因是,(right - left) 表示了左边界和右边界之间的距离,然后除以2,得到的结果就是中间位置相对于左边界的偏移量。这个偏移量被加到左边界上,从而得到中间位置。

        这种方式确保了中间位置的计算不会导致整数溢出,因为它始终处理整数边界的相对偏移量,而不是绝对值。这在处理大数组时特别重要,以确保算法的正确性。

二、左闭右开写法[left,right] 

定义 target 是在⼀个在左闭右开的区间⾥,也就是[left, right) ,那么二分法的边界处理⽅式则截然不同。
有如下两点:

  • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
  • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下⼀个查询区间不会去比较nums[middle],

代码演示: 

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;                 // 定义左边界int right = nums.size();      // 定义右边界,注意这里是 nums.size(),不再减1while (left < right) {int middle = left + (right - left) / 2;  // 计算中间位置,避免整数溢出if (nums[middle] == target) {return middle;  // 找到目标,返回索引} else if (nums[middle] > target) {right = middle;  // 目标在左半部分,更新右边界,不再减1} else {left = middle + 1;  // 目标在右半部分,更新左边界}}return -1;  // 如果未找到目标元素}
};

写在最后:以上就是本篇文章的内容了,感谢你的阅读。如果感到有所收获的话可以给博主点一个赞哦。如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

tips:学于代码随想录

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

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

相关文章

VS Code2023安装教程(最新最详细教程)附网盘资源

目录 一.简介 二.安装步骤 三.VS Code 使用技巧 网盘资源见文末 一.简介 VS Code是一个由微软开发的跨平台的轻量级集成开发环境&#xff08;IDE&#xff09;&#xff0c;被广泛用于编写各种编程语言的代码。它支持多种编程语言&#xff0c;并且可以通过插件扩展功能。 以…

Undefined reference错误处理及Linux设置动态链接库so的默认搜索路径

文章目录 1 问题的提出2 问题的分析3 问题的解决3.1 Windows的VS修改配置属性3.2 Linux系统里添加搜索路径json在/usr/llib目录中libcryto.so在/usr/lib64文件夹中 Linux设置动态链接库so的默认搜索路径方法一&#xff1a;修改 ld.so.conf 文件方法二&#xff1a;修改环境变量方…

为什么 hooks 不能放在循环或者条件判断语句里?

React 官网介绍了 Hook 的这样一个限制&#xff1a; 不要在循环&#xff0c;条件或嵌套函数中调用 Hook&#xff0c; 确保总是在你的 React 函数的最顶层以及任何 return 之前调用他们。遵守这条规则&#xff0c;你就能确保 Hook 在每一次渲染中都按照同样的顺序被调用。这让 R…

matlab 布尔莎七参数坐标转换模型

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫自重,把自己当个人。 一、算法原理 算法原理与实现代码已在免费文章:布尔莎七参数坐标转换模型一文中给出,不想看付费文章直接跳转即可。 二、代码实现 clc; clear; close all; %% --

08 _ 栈:如何实现浏览器的前进和后退功能?

浏览器的前进、后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面a-b-c之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面b和a。当你后退到页面a,点击前进按钮,就可以重新查看页面b和c。但是,如果你后退到页面b后,点击了新的页面d,那就无法再通过前进、后退…

Java中的锁:类型,比较,升级与降级

在Java中&#xff0c;锁是一种用于实现并发控制的重要工具。在多线程环境中&#xff0c;锁可以确保数据的一致性和完整性。Java提供了多种类型的锁&#xff0c;包括内置的synchronized关键字&#xff0c;ReentrantLock类以及更高级的并发工具&#xff0c;如StampedLock和ReadWr…

软考系统架构师知识点集锦十:计算机网络、数学与经济管理、知识产权与标准化

一、计算机网络 1.1、考情分析 2.1 TCP/IP协议簇 2.1.1常见协议及功能 网际层是整个TCP/IP体系结构的关键部分,其功能是使主机可以把分组发往任何网络并使分组独立地传向目标。 POP3: 110 端口&#xff0c;邮件收取SMTP: 25 端口&#xff0c;邮件发送FTP: 20数据端口/21控制…

Python异常处理

文章目录 异常格式异常类型自定义抛出异常类 异常格式 异常处理格式&#xff08;else和finally可省略&#xff09; try:path1&#xff08;可能发送异常的部分&#xff09; except:path2 else:path3 finally:path4如果没发送异常&#xff0c;执行path1, path3, path4 如果发送…

nextcloud+onlyoffice环境搭建(在线 or 离线)

1.安装 MySQL&#xff08;有MySQL就可以不装&#xff09; docker run -itd --name mysql8.0 -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot --restartalways -e TZ"Asia/Shanghai" -v /home/docker/workspace/mysql:/var/lib/mysql mysql:latest --lower_case_table_na…

正点原子嵌入式linux驱动开发——外置RTC芯片PCF8563

上一章学习了STM32MP1内置RTC外设&#xff0c;了解了Linux系统下RTC驱动框架。一般的应用场合使用SOC内置的RTC就可以了&#xff0c;而且成本也低&#xff0c;但是在一些对于时间精度要求比较高的场合&#xff0c;SOC内置的RTC就不适用了。这个时候需要根据自己的应用要求选择合…

uni-app——如何阻止事件冒泡

引言 在开发移动应用程序时&#xff0c;我们经常需要处理用户交互事件。然而&#xff0c;有时候这些事件会冒泡&#xff0c;导致意外的行为和不良用户体验。在本文中&#xff0c;我们将探讨如何使用UniApp框架来阻止事件冒泡&#xff0c;并提供一些示例代码来帮助您理解如何实…

吉他、班卓琴和贝斯吉他降分器:Arobas Music Guitar 8.1.1

Arobas Music Guitar 是一款专业的吉他、班卓琴和贝斯吉他降分器。在熟练的手中&#xff0c;它不仅可以让您创作&#xff0c;还可以编辑、聆听和录制&#xff0c;以及导入和导出乐谱。如果有人感兴趣的话&#xff0c;录音是在八个轨道上进行的&#xff0c;你可以为每个轨道单独…

【go】两数求和

文章目录 题目代码解法2 代码仓库 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案…

LeetCode 面试题 16.09. 运算

文章目录 一、题目二、C# 题解 一、题目 请实现整数数字的乘法、减法和除法运算&#xff0c;运算结果均为整数数字&#xff0c;程序中只允许使用加法运算符和逻辑运算符&#xff0c;允许程序中出现正负常数&#xff0c;不允许使用位运算。 你的实现应该支持如下操作&#xff1a…

android wifi和数据网络(以太网切换)出现的问题

场景1&#xff1a; 在实车上测试车机连接路由器的性能&#xff0c;车机连接着以太网&#xff0c;但是以太网没有网 然后车机通过WIFI连接一个路由器&#xff0c;电脑也连接路由器&#xff0c;突然发现车机通过路由器无法ping通路由器下的电脑&#xff0c;而且也ping不通路由器…

【数据挖掘 | 数据预处理】缺失值处理 重复值处理 文本处理 确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

xxl-job-架构及原理

分布式调度框架 服务端 1、根据执行器创建任务&#xff0c; 2、底层通过netty发起调度。 客户端 1、注册到服务端成为执行器 2、注册任务类&#xff0c;任务类需要实现JobHandler这个接口的类 2、接受调度请求&#xff0c;找到对应的bean&#xff0c;并把bean放到线程池&…

模型对象CSS2DObject始终在画布的左上角(问题解决)

写了个简单案例模拟一下这个问题&#xff0c;看下图片 下面看下c2渲染器相关代码部分 this.css2DRenderer new CSS2DRenderer(); this.css2DRenderer.render(this.scene, this.camera); this.css2DRenderer.setSize(width, height); this.css2DRenderer.domElement.style.pos…

客户端与服务端实时通讯(轮询、websocket、SSE)

客户端与服务端实时通讯 背景 在某些项目中&#xff0c;某些数据需要展示最新的&#xff0c;实时的&#xff0c;这时候就需要和服务端进行长时间通讯 方案 对于数据实时获取&#xff0c;我们一般会有4种方案&#xff1a; 1.短轮询&#xff1a;使用浏览器的定时器发起http请…

AtCoder Beginner Contest 326 题解 A-D

目录 A - 2UP3DOWNB - 326-like NumbersC - PeakD - ABC Puzzle A - 2UP3DOWN 原题链接 题目描述 给定一个X代表你当前所在楼层&#xff0c;再给定一个Y代表你想要到达的楼层&#xff0c;但是你最多只能上两层楼或者下三层楼&#xff0c;问是否能够到达Y。 思路&#xff1a;模…