前言

        在算法竞赛中,二分查找使用的频率是非常高的,对于C++选手而言,有STL中自带的lower_bound和upper_bound二分查找,可以很方便的进行二分查找。但是非C++选手、或者需要自定义多条件查找的情况需要自己写一个二分,本文对几种常见的二分查找写法进行讲解。

        本文使用的编程语言为Java,但代码比较好理解其他语言选手也可以查看本文来学习二分相关内容。


二分查找

        二分查找,也称折半查找,是一种可以在有序序列上进行快速查找的算法,时间复杂度是O(logn)

        常见的二分查找类型,有以下两种:

  • 查找目标值在序列中不小于目标值的第一个元素(同lower_bound,以此查到第一个位置)。

  • 查找目标值在序列中第一个大于目标值的元素(同upper_bound,以此查找到最后一个出现的位置)。

        在设置区间的时候,根据写法的不同分为下面几种:

  • 左闭右闭。

  • 左闭右开。

        根据最终获取答案的写法,又分为下面两种:

  • 在左右指针处取值。

  • 设置额外变量取值。

        本文将分不同情况,写出不同情况下的二分查找模板,帮助大家理解学习。


查找目标值在序列中不小于目标值的第一个元素

        也就是实现一个STL中的lower_bound。

左闭右闭版

/*** [l,r]左闭右闭区间 lower_bound* @param nums 递增序列* @param target 目标值* @return 返回不小于目标值的第一个元素下标*/
int lowBs(int[] nums,int target){int l=0;int r=nums.length-1;while(l<=r){int mid=l+(r-l>>1);if(nums[mid]<target){l=mid+1;}else{r=mid-1;}}return l;
}

左闭右开版

/*** [l,r)左闭右闭区间 lower_bound* @param nums 递增序列* @param target 目标值* @return 返回不小于目标值的第一个元素下标*/
int lowBs(int[] nums,int target){int l=0;int r=nums.length;while(l<r){int mid=l+(r-l>>1);if(nums[mid]<target){l=mid+1;}else{r=mid;}}return l;
}

查找目标值在序列中第一个大于目标值的元素

        也就是实现一个STL中的upper_bound。

左闭右闭版

/***  [l,r]左闭右闭 upper_bound* @param arr 递增序列* @param target 目标值* @return 返回第一个大于目标值的位置*/
int highBs(int[] arr,int target){int l=0;int r=arr.length - 1;while(l<=r){int mid=l+(r-l>>1);if(arr[mid]<=target){l=mid+1;}else{r=mid-1;}}return l;
}

左闭右开版

/***  [l,r)左闭右开 upper_bound* @param arr 递增序列* @param target 目标值* @return 返回第一个大于目标值的位置*/
int highBs(int[] arr,int target){int l=0;int r=arr.length;while(l<r){int mid=l+(r-l>>1);if(arr[mid]<=target){l=mid+1;}else{r=mid;}}return l;
}

易错问题和常见问题总结

一、需要注意区间定义和终止条件是否匹配正确

  • 左闭右闭:初始化 r = nums.length-1,终止条件 while (l <= r)

  • 左闭右开:初始化 r = nums.length,终止条件 while (l < r)

二、指针更新是否正确

  • 左闭右闭:r = mid - 1l = mid + 1

  • 左闭右开:r = mid

三、运算符优先级

        应写为:int mid = l + ( r - l >> 1)

?为什么不能写为 l + r >> 1

        如果可以保证l+r不会溢出的话,其实这样写也可以,但是为了保证不出现数据溢出,更加推荐写上面的形式。

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

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

相关文章

兰亭妙微:火箭发射界面案例分享

北京蓝蓝设计团队来自清华美院&#xff0c;工作多年&#xff0c;行业经验丰富&#xff0c;专业性很强。我们是热爱设计&#xff0c;设计不仅是我们的专业&#xff0c;我们的职业&#xff0c;还是我们的爱好。每一个蓝蓝设计的设计师都希望自己的设计越来越好&#xff0c;以高标…

完美解决.NET Framework 4.0 中 System.Drawing 库不支持 WebP 格式的图像处理

如果你想在 .NET Framework 4.0 中使用 ImageMagick 处理图片&#xff0c;可以通过 Magick.NET 库来实现。Magick.NET 是 ImageMagick 的 .NET 封装&#xff0c;可以用来读取、写入、编辑图像。 以下是如何使用 Magick.NET 来处理图像并提取图像的宽度和高度。 步骤&#xff…

string--OJ1

链接: 例一 链接: 例er class Solution { public:int myAtoi(string str) {int sign 1;int ret0;int i0;while(str[i] ){i;}if(str[i]||str[i]-){if(str[i]-)sign*-1;i;}while(str[i]>0&&str[i]<9){int rstr[i] - 0;if(ret>INT_MAX/10||(retINT_MAX/10&…

Go 写一个简单的Get和Post请求服务

Go 写一个简单的Get和Post请求服务 ✅ 一、准备工作 安装 Go 官网下载地址 安装后执行&#xff1a; go version安装 VS Code 插件 在 VS Code 插件市场搜索并安装插件&#xff1a;Go&#xff08;由 Go 团队提供&#xff09; 配置环境变量&#xff08;可选&#xff09; 设置 …

哪些因素会影响远程视频监控的质量?浅述EasyCVR视频智能诊断技术

在安防领域&#xff0c;无线监控系统凭借其灵活部署、便捷扩展的特性得到广泛应用。然而&#xff0c;实时监控图像清晰度不足、回放调查受限等问题&#xff0c;严重制约了其应用效果。经分析&#xff0c;摄像机性能、线缆质量、无线网桥性能、交换机配置及供电电压等是影响图像…

Java大师成长计划之第10天:锁与原子操作

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在多线程编程中&#xff0c;锁与原子…

线性代数——行列式⭐

目录 一、行列式的定义⭐ 1-1、三阶行列式练习 1-2、下面介绍下三角行列式、上三角行列式、对角行列式 ​编辑 二、行列式的性质 2-1、性质1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6 ​编辑 2-2、性质7 2- 3、拉普拉斯定理、克莱姆法则 三…

微软推出数款Phi 4“开放式”人工智能模型

微软周三推出了几款新的“开放式”人工智能模型&#xff0c;其中功能最强大的模型至少在一个基准测试上可与 OpenAI 的 o3-mini 相媲美。所有新的授权模型——Phi 4 mini reasoning、Phi 4 reasoning 和 Phi 4 reasoning plus——都是“推理”模型&#xff0c;这意味着它们能够…

VPN访问SAP组服务器报登陆负载均衡错误88:无法连接到消息服务器(RC=9)

用户反馈用SAPGUI接入SAP时报错&#xff1a;登陆负载均衡错误88&#xff1a;无法连接到消息服务器(RC9) 经了解是通过VPN访问&#xff0c;但VPN没有放行ICMP访问&#xff0c;导致不能PING通&#xff0c;不能确认是网络问题还是什么问题。 解决方案&#xff1a; 1、VPN由原&am…

使用AI-01开发板和开源后端服务搭建整套小智服务系统

使用AI-01开发板和开源后端服务搭建整套小智服务系统 四博智联的AI-01开发板&#xff0c;基于乐鑫ESP32-C2 专属定制的离线语音模组&#xff0c;能够完美的接入小智AI服务平台&#xff0c;再使用开源后端服务&#xff0c;就能够搭建一个完整的小智AI服务系统了。 下面是具体…

字节跳动在GitHub上有哪些开源项目

字节跳动&#xff08;ByteDance&#xff09;在GitHub上开源了许多项目&#xff0c;涵盖前端、后端、云原生、AI、数据库等多个领域。以下是一些典型项目及其简介&#xff1a; 1. 前端 & 跨平台开发 Hippy 仓库: Tencent/Hippy&#xff08;注&#xff1a;Hippy 最初由腾讯开…

超长8分钟Suno V4.5 – 支持一首歌多风格转换啦~~~

f历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中&#xff0c;支持120并发任务 AI音乐支持中文&#xff0c;实测效果&#xff0c;大家自己听听看喽 2025年新年快乐&#xff0c;Viggle AI打开新年快乐 让照片舞动起来&#xff0c;只要3分钟就可以搞定了&#xff0c;…

vue3+ts项目 配置vue-router

安装vue-router pnpm install vue-router配置 1.src/router/index.ts文件下的内容 import type { App } from vue import type { RouteRecordRaw } from vue-router import { createRouter, createWebHistory } from vue-router import remainingRouter from ./modules/remai…

如何利用dify 生成Fine‑tune 需要的Alpaca 格式数据

如果你选择llamafactory 格式进行微调&#xff0c;它只是格式是Alpaca格式&#xff0c;dify 的agent dsl 如下&#xff0c;你可以导入本地的dify 或者导入cloud 版本的&#xff1b;测试版本是0.1.5 app:description: 上传文件&#xff0c;基于文件内容&#xff0c;使用 Silico…

C++开发指南

一、C++ 是什么? C++ 是一种强大、灵活、高性能的系统级编程语言,由 Bjarne Stroustrup 在 20 世纪 80 年代初开发,是 C 语言的超集。它既支持面向过程编程,也支持面向对象、泛型、函数式等现代范式。 C++ 被广泛应用于: 系统软件(如操作系统、编译器)游戏开发(如 Un…

重测序关系矩阵构建方式汇总

样本间亲缘关系矩阵&#xff08;kinship matrix&#xff09;和同源性矩阵&#xff08;IBS matrix&#xff09;构建的方式 1. 可以使用plink的–make-rel计算个体之间的亲缘关系&#xff08;强调个体之间的遗传相似性&#xff09; /opt/software/plink --bfile vcf_bfile--mak…

docker 部署前、后端分离项目详细步骤(从打包到部署)

在平常的开发工作中&#xff0c;一个项目经历需求、开发、测试、上线等步骤。在开发测试完成后&#xff0c;我们需要部署测试环境、生产环境等&#xff0c;那么我们用 docker 方式应该怎么部署呢&#xff1f;前后端分离的项目又该如何部署呢&#xff1f;那么&#xff0c;今天我…

大语言模型理解一般需求到在专业领域中最大限度地发挥其效能的演变轨迹

在人工智能技术飞速发展的当下&#xff0c;大语言模型&#xff08;LLM&#xff09;凭借其强大的语言处理能力和广泛的应用潜力&#xff0c;成为了各行业关注的焦点。从最初的文本生成、简单问答&#xff0c;到如今在专业领域的深度应用&#xff0c;大语言模型与用户的交互模式正…

mindyolo填坑

1、按照gitee上的文档跑预测代码&#xff0c;跑不通 更改&#xff1a; 将predict.py复制到跟目录。如果是cpu&#xff08;本地测试比较常见&#xff09;&#xff0c;那么正确的命令行是&#xff1a; python predict.py --device_targetCPU --config ./configs/yolov7/yolov7.…

Python集合全解析:从基础到高阶应用实战

一、集合核心特性与创建方法 1.1 集合的本质特征 Python集合&#xff08;Set&#xff09;是一种​​无序且元素唯一​​的容器类型&#xff0c;基于哈希表实现&#xff0c;具有以下核心特性&#xff1a; ​​唯一性​​&#xff1a;自动过滤重复元素​​无序性​​&#xff…