当前位置: 首页 > news >正文

二分查找算法详讲(三种版本写法)原创

介绍:

二分查找算法(Binary Search)是一种在有序数组中查找目标元素的算法。
它的基本思想是通过将目标元素与数组的中间元素进行比较,从而将搜索范围缩小一半。

  • 如果目标元素等于中间元素,则搜索结束;
  • 如果目标元素小于中间元素,则继续在左半部分查找;
  • 如果目标元素大于中间元素,则在右半部分查找。

通过不断地将搜索范围缩小一半,最终可以找到目标元素或确定目标元素不存在。

接下来通过例题介绍二分的不同写法

例题:

输入一个整数 n, 接下来一行输入 n 个整数(保证整数序列有序), 最后输入一个整数 m, 查找 m 在序列中的起始下标和结束下标

示例1:

输入:

5
1 2 2 4 5
2

输出:

1 2

解释:

2 在序列中的起始和结束位置是下标 1 和 2

代码讲解:

二分代码按照退出条件分为

  1. while (l <= r)
  2. while (l < r)

代码中的所有 lr 都是序列的左右闭区间

代码中的所有 l + r >> 1l + r + 1 >> 1 分别相当于 (l + r) / 2(l + r + 1) / 2>>是按位右移, 整数向右位移一位相当于除2

代码中的所有 x, 都是目标值, 也就是要查找的值; 所有的 idx, 是答案, 也就是要查找数的起始下标或结束下标

先讲第一种: while (l <= r), 在l > r时退出

// 查找起始下标
int l = 0, r = n - 1, idx = 0;
while (l <= r)
{int mid = l + r >> 1;  // 一分为3, [l, mid), [mid, mid], (mid, r]if (a[mid] < x) l = mid + 1;  // 如果当前中间值比 x 小, 需要去序列的右区间, 因为mid位置的数比 x 小, 那么左边的区间(l, mid]的所有数都比 x 小else if (a[mid] > x) r = mid - 1;  // 同上else if (a[mid] == x)  // 等于答案时{idx = mid;r = mid - 1;  // 我们要找的时起始的下标, 虽然此时a[mid] == x, 但是mid的左边可能还有等于x的值, 所以我们要继续往左区间去找}
}// 查找结束下标(代码中只有注释的地方和上面的代码不一样)
int l = 0, r = n - 1, idx = 0;
while (l <= r)
{int mid = l + r >> 1;  // 一分为3, [l, mid), [mid, mid], (mid, r]if (a[mid] < x) l = mid + 1;  else if (a[mid] > x) r = mid - 1;  else if (a[mid] == x)  {idx = mid;l = mid + 1;  // 我们要找的时结束的下标, 虽然此时a[mid] == x, 但是mid的右边可能还有等于x的值, 所以我们要继续往右区间去找}
}

观察上面代码我们可以把a[mid] == x的情况跟其他两种情况合并

// 查找起始下标
int l = 0, r = n - 1, idx = 0;
while (l <= r)
{int mid = l + r >> 1;  // 一分为3, [l, mid), [mid, mid], (mid, r]if (a[mid] < x) l = mid + 1;  else if (a[mid] >= x){idx = mid;r = mid - 1;  // 继续往左区间找}
}// 查找结束下标
int l = 0, r = n - 1, idx = 0;
while (l <= r)
{int mid = l + r >> 1;if (a[mid] <= x){idx = mid;l = mid + 1;  // 继续往右区间找}else if (a[mid] > x) r = mid - 1;
}

下面讲第二种: while (l < r) 在l == r时退出

大家可以发现这种写法不需要 idx 这个变量来记录最终查找的x的起始下标或结束下标了, 因为最后l就是对应的起始下标或结束下标。(r等于l, 所以用r也行)

查找起始下标
int l = 0, r = n - 1;
while (l < r)
{int mid = l + r >> 1;  // 区间分成了两个 [l, mid] 和 (mid, r]if (a[mid] < x) l = mid + 1;// 当a[mid] == x的时候, r一直往左, 所以当有多个相同的x的话, 会查找到第一个else if (a[mid] >= x) r = mid;  // 因为a[mid]可能 == x, 因为mid也可能满足条件, 所以区间变成[l, mid]
}查找结束下标
int l = 0, r = n - 1, idx = 0;
while (l < r)
{				int mid = l + r + 1 >> 1;  // 区间分成了两个 [l, mid) 和 [mid, r]if (a[mid] > x) r = mid - 1;// 当a[mid] == x的时候, l一直往右, 所以当有多个相同的x的话, 会查找到最后一个else if (a[mid] <= x) l = mid;  // 因为a[mid]可能 == x, 因为mid也可能满足条件, 所以区间变成[mid, r]
}

接下来讲一下第二种查找结束下标的时候 为什么是 mid = l + r + 1 >> 1,而不是 mid = l + r >> 1;
c++默认向0取整, 对于正整数你可以说是向下取整, 也就是 5 / 2 = 2,
当出现 l = r - 1 的时候, 此时 mid = (l + r) / 2 向下取整后等于 r - 1 , 如果此时进入了a[mid] <= x的分支, 那么 l = mid = r - 1, 这时会发现 l 没有发生变化, 那么就会一直陷入死循环

先更到这里, 后面再补充

觉得写的不错的话, 点个赞吧

相关文章:

二分查找算法详讲(三种版本写法)原创

介绍: 二分查找算法&#xff08;Binary Search&#xff09;是一种在有序数组中查找目标元素的算法。 它的基本思想是通过将目标元素与数组的中间元素进行比较&#xff0c;从而将搜索范围缩小一半。 如果目标元素等于中间元素&#xff0c;则搜索结束&#xff1b;如果目标元素小…...

Git钩子(Hooks)之commit之前自动执行脚本

介绍 官方文档&#xff1a; 英文&#xff1a;https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks中文&#xff1a;https://git-scm.com/book/zh/v2/自定义-Git-Git-钩子 下面只复制了pre-commit部分文档&#xff0c;其他详见官方文档。 Git Hooks Like many other…...

nano机器人2:机械臂的视觉抓取

前言 参考链接: 【机械臂入门教程】机械臂视觉抓取从理论到实战 GRCNN 通过神经网络&#xff0c;先进行模型训练&#xff0c;在进行模型评估。 机械臂逆运动学求解 所有串联型6自由度机械臂均是可解的&#xff0c;但这种解通常只能通过数值解法得到&#xff0c;计算难度大&am…...

技术速递|宣布 Java on Azure 开发工具支持 Java on Azure Container Apps

作者&#xff1a;Jialuo Gan 排版&#xff1a;Alan Wang 在 Microsoft Build 2024 期间宣布&#xff0c;Azure Container Apps 现在可为 Java 开发人员提供丰富的操作功能。(详细内容请参见本博客&#xff09;。 我们很高兴地与大家分享&#xff0c;Azure Toolkit for Intelli…...

随机森林算法实现分类

随机森林算法实现对编码后二进制数据的识别 1.直接先上代码&#xff01; import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import …...

Ubuntu卸载软件

在删除这些目录之前&#xff0c;你必须确定一个非常重要的事情&#xff1a;确认没有任何服务正在使用这些版本的 PHP。如果你删除了正在使用的 PHP 版本的扩展目录&#xff0c;那么依赖于这个版本的 PHP 的网站或服务可能会停止工作。 如果你确定某个版本的 PHP 没有在使用中&…...

网络工程师:网络可靠性技术

一、可靠性 平均故障间隔时间MTBF(Mean Time Between Failure)和平均修复时间MTTR(Mean Time to Repair)这两个指标来评价系统的可靠性。 1、平均故障间隔时间MTBF MTBF是指一个系统无故障运行平均时间&#xff0c;通常以小时为单位。MTBF越大可靠性越高。 2、平均修复时间MTTR…...

科技引领未来:高速公路可视化

高速公路可视化监控系统利用实时视频、传感器数据和大数据分析&#xff0c;通过图扑 HT 可视化展示交通流量、车速、事故和路况信息。交通管理人员可以实时监控、快速响应突发事件&#xff0c;并优化交通信号和指挥方案。这一系统不仅提高了道路安全性和车辆通行效率&#xff0…...

Golang发送POST请求并传递JSON数据

客户端 package mainimport ("c02_get_param/common""fmt""zdpgo_resty" )func main() {// Create a Resty Clientclient : zdpgo_resty.New()// 设置字符串resp, err : client.R().SetHeader("Content-Type", "application/jso…...

C++实现生产者消费者模型

生产者-消费者模型是一种典型的多线程并发模式&#xff0c;常用于在一个共享缓冲区中协调生产者和消费者之间的数据传递。在C中&#xff0c;我们可以使用标准库中的线程、互斥量和条件变量来实现该模型。以下是一个简单的生产者-消费者模型的实现示例&#xff1a; #include &l…...

【Mac】MWeb Pro(好用的markdown编辑器) v4.5.9中文版安装教程

软件介绍 MWeb Pro for Mac是一款Mac上的Markdown编辑器软件&#xff0c;它支持实时预览&#xff0c;语法高亮&#xff0c;自动保存和备份等功能&#xff0c;并且有多种主题和样式可供选择。此外&#xff0c;MWeb还支持多种导出格式&#xff0c;包括HTML、PDF、Word、ePub等&a…...

C++ | Leetcode C++题解之第118题杨辉三角

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> ret(numRows);for (int i 0; i < numRows; i) {ret[i].resize(i 1);ret[i][0] ret[i][i] 1;for (int j 1; j &…...

3D透视图转的时候模型闪动怎么解决?---模大狮模型网

在3D建模与渲染的世界中&#xff0c;透视图是我们观察和操作模型的重要窗口。然而&#xff0c;有时候在旋转透视图时&#xff0c;模型会出现闪动的现象&#xff0c;这不仅影响了我们的工作效率&#xff0c;还可能对最终的渲染效果产生负面影响。本文将探讨这一问题的成因&#…...

如何创建一个vue项目?详细教程,如何创建第一个vue项目?

已经安装node.js在自己找的到的地方新建一个文件夹用于存放项目&#xff0c;记住文件夹的存放路径&#xff0c;以我为例&#xff0c;我的文件夹路径为D:\tydic 打开cmd命令窗口&#xff0c;进入刚刚的新建文件夹 切换硬盘&#xff1a; D: 进入文件夹&#xff1a;cd tydic 使…...

AWS迁移与传输之Migration Hub

AWS Migration Hub是一种集中化的迁移管理服务&#xff0c;可帮助企业规划、跟踪和管理在亚马逊云中进行的各种迁移活动。包括应用程序迁移、数据库迁移、服务器迁移等。 AWS Migration Hub (Migration Hub) 提供一个位置来跟踪使用多个 AWS 工具和合作伙伴解决方案的迁移任务…...

网络渗透思考

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 windows的明文密码:是通过LSA&#xff08;Local Security Authority&#xff09;进行存储加密的 存储过程:当用户输入密码之…...

2.8万字总结:金融核心系统数据库升级路径与场景实践

OceanBase CEO 杨冰 谈及数字化转型&#xff0c;如果说过去还只是头部金融机构带动效应下的“选择题”。那么现在&#xff0c;我相信数字化转型已经成为不论大、中、小型金融机构的“必答题”。 本文为OceanBase最新发布的《万字总结&#xff1a;金融核心系统数据库升级路径…...

Linux:进程控制(二.详细讲解进程程序替换)

上次讲了&#xff1a;Linux&#xff1a;进程地址空间、进程控制&#xff08;一.进程创建、进程终止、进程等待&#xff09; 文章目录 1.进程程序替换1.1概念1.2原理1.3使用一个exec 系列函数execl&#xff08;&#xff09;函数结论与细节 2.多进程时的程序替换3.其他几个exec系…...

Elasticsearch8.13.4版本的Docker启动关闭HTTPS

博主环境是&#xff1a; 开发环境&#xff1a;SpringbootElasticSearch客户端对应的starter 2.6.3版本 maven配置 <!-- ElasticSearch --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elas…...

linux 之dma_buf (8)- ION简化版本

一、前言 我们学习了如何使用 alloc_page() 方式来分配内存&#xff0c;但是该驱动只能分配1个PAGE_SIZE。本篇我们将在上一篇的基础上&#xff0c;实现一个简化版的ION驱动&#xff0c;以此来实现任意 size 大小的内存分配。 二、准备 为了和 kernel 标准 ion 驱动兼容&…...

用LAMMPS做材料分析?手把手教你用Ovito绘制应力、温度、速度云图(附完整脚本)

从LAMMPS到Ovito&#xff1a;材料模拟数据可视化的全流程实战指南 在计算材料科学领域&#xff0c;分子动力学模拟产生的海量数据如何转化为直观、可发表的科学图表&#xff0c;一直是研究者面临的挑战。本文将系统介绍从LAMMPS模拟到Ovito可视化的完整工作流&#xff0c;重点解…...

从用户吐槽到功能升级:我们如何用sunny-video优化了uniapp视频课件的学习体验

从用户痛点到产品升级&#xff1a;sunny-video如何重塑uniapp视频学习体验 在线教育产品的核心价值在于高效传递知识&#xff0c;而视频播放体验往往成为用户留存的关键瓶颈。去年第三季度&#xff0c;我们团队收到超过1200条用户反馈&#xff0c;其中67%集中抱怨两个问题&…...

DLSS Swapper终极指南:如何免费智能管理游戏DLSS文件,提升游戏性能

DLSS Swapper终极指南&#xff1a;如何免费智能管理游戏DLSS文件&#xff0c;提升游戏性能 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否厌倦了每次游戏更新后手动替换DLSS文件的繁琐操作&#xff1f;你是否希…...

LinuxUDP丢包自动化巡检实践

LinuxUDP丢包自动化巡检实践这是一篇面向中级 Linux 使用者的技术文章&#xff0c;主题聚焦在UDP丢包&#xff0c;重点讨论无连接流量、内核缓冲和应用接收能力。在真实生产环境中&#xff0c;UDP丢包相关问题往往不会以单一错误形式出现&#xff0c;而是混杂在日志、权限、资源…...

影像技术实战11:视频封面生成黑屏、模糊、重复?FFmpeg + OpenCV 构建高质量缩略图自动优选方案

影像技术实战11&#xff1a;视频封面生成黑屏、模糊、重复&#xff1f;FFmpeg OpenCV 构建高质量缩略图自动优选方案 一、问题场景&#xff1a;封面不是“随便截一帧” 在视频平台、素材管理系统、内容审核后台、AI 剪辑工具里&#xff0c;视频上传后自动生成封面是一个很常见…...

如何一键自动化部署Office:LKY Office Tools完整配置指南

如何一键自动化部署Office&#xff1a;LKY Office Tools完整配置指南 【免费下载链接】LKY_OfficeTools 一键自动化 下载、安装、激活 Office 的利器。 项目地址: https://gitcode.com/GitHub_Trending/lk/LKY_OfficeTools 在Windows系统中安装Microsoft Office一直是个…...

网络安全有哪些岗位?如何成为一名优秀的网络安全工程师?

网络安全有哪些岗位&#xff1f;如何成为一名优秀的网络安全工程师&#xff1f; 网络安全是什么&#xff1f; 首先说一下什么是网络安全&#xff1f;其中&#xff0c;网络安全工程师工作内容具体有哪些&#xff1f; 网络安全 确保网络系统的硬件、软件及其系统中的数据受到保护…...

保姆级教程:解决PyTorchViz安装报错,手把手教你用AlexNet模型可视化

PyTorch模型可视化实战&#xff1a;从安装报错到AlexNet结构解析全指南 在深度学习模型开发过程中&#xff0c;可视化工具如同开发者的"第二双眼睛"。PyTorchViz作为PyTorch生态中轻量级但功能强大的可视化工具&#xff0c;能直观展示模型的计算图结构&#xff0c;帮…...

GAMES101图形学笔记:从光栅化到路径追踪,我的自学避坑路线图

GAMES101图形学自学指南&#xff1a;从光栅化到路径追踪的实战路线 在B站上拥有数百万播放量的GAMES101课程&#xff0c;已经成为计算机图形学爱好者入门的黄金标准。作为一门融合数学、物理和编程的交叉学科&#xff0c;图形学的学习曲线往往令人望而生畏。本文将分享我自学G…...

LeetCode 找到最终的安全状态题解

LeetCode 找到最终的安全状态题解 题目描述 给定一个有向图&#xff0c;找到所有安全节点。安全节点是永远不会走向环的节点。 示例&#xff1a; 输入&#xff1a;graph [[1,2],[2,3],[5],[0],[5],[],[]]输出&#xff1a;[2,4,5,6] 解题思路 方法&#xff1a;拓扑排序 思路&am…...