二分查找之红蓝二分查找

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
系列专栏:xiaoxie的算法系列专栏——CSDN博客●'ᴗ'σσணღ*
我的目标:"团团等我💪( ◡̀_◡́ ҂)" 

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​+关注(互三必回)!

目录

 一.二分查找

 1.说明

2.二分查找的模板

1.普通二分查找模板:

2.寻找左边界的二分查找模板

3. 寻找右边界的二分查找模板

4. 二分查找变体模板1(寻找第一个满足条件的值):

5. 二分查找变体模板2(寻找最后一个满足条件的值):

6. 旋转数组的二分查找模板:

3.红蓝二分查找法

1. 

 

df1a6ad258684edd8bd72c937b3984c3.jpeg

 一.二分查找

 1.说明

相信有很多读者都认为二分查找法就是一个非常简单的算法,没有什么技术含量,博主想说的是二分查找本身的思想确实十分简单,当它奇妙的就是在它的边界确定条件上,相信大家在写二分查找的时候经常在边境确定的时候出现问题导致结果出现误差。

2.二分查找的模板

此外,目前二分查找主流的有六套模板。博主把它们归纳总结了一下

1.普通二分查找模板:

public int binarySearch(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;  // 找到目标值,返回索引} else if (nums[mid] < target) {left = mid + 1;  // 目标值在右半部分} else {right = mid - 1;  // 目标值在左半部分}}return -1;  // 未找到目标值
}

2.寻找左边界的二分查找模板

public int leftBound(int[] nums, int target) {int left = 0, right = nums.length;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;  // 目标值在右半部分} else {right = mid;  // 目标值在左半部分}}return left;  // 返回左边界索引
}

3. 寻找右边界的二分查找模板

public int rightBound(int[] nums, int target) {int left = 0, right = nums.length;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] <= target) {left = mid + 1;  // 目标值在右半部分} else {right = mid;  // 目标值在左半部分}}return left - 1;  // 返回右边界索引
}

4. 二分查找变体模板1(寻找第一个满足条件的值):

public int firstPosition(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;  // 目标值在右半部分} else {right = mid;  // 目标值在左半部分}}return nums[left] == target ? left : -1;  // 返回第一个满足条件的值的索引
}

5. 二分查找变体模板2(寻找最后一个满足条件的值):

public int lastPosition(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left < right) {int mid = left + (right - left + 1) / 2;if (nums[mid] > target) {right = mid - 1;  // 目标值在左半部分} else {left = mid;  // 目标值在右半部分}}return nums[left] == target ? left : -1;  // 返回最后一个满足条件的值的索引
}

6. 旋转数组的二分查找模板:

public int searchRotated(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;  // 找到目标值,返回索引}if (nums[left] <= nums[mid]) {if (nums[left] <= target && target < nums[mid]) {right = mid - 1;  // 目标值在左半部分} else {left = mid + 1;  // 目标值在右半部分}} else {if (nums[mid] < target && target <= nums[right]) {left = mid + 1;  // 目标值在右半部分} else {right = mid - 1;  // 目标值在左半部分}}}return -1;  // 未找到目标值
}

以上就是目前主流的一些二分查找的模板,当然如果大家对二分查找有着深刻了解,也可以自己创建出一些二分查找的模板,只有你能理解二分法这一思想,再加上对边界的判断我相信你对二分查找法应该没什么问题

3.红蓝二分查找法

1. 说明

博主介绍的红蓝二分查找法和普通二分查找法不同的是

这套模板和常规的模板存在不一样: 主体思路:L 指针掌管左边蓝色区域, R指针掌管右边红色区域,两者互不冲突,通过不断向目标元素靠近扩大掌管区域,直到两者掌管区域接壤,即 l+1==r  时终止。

ec9c196bdb0b4ab9b704f5068f889a4b.png

 2.模板

//简代码
int L = 0;
int R = nums.length;
while(L+1 < R) {int M = (L+R)/2//如果数字大时可以使用 M = L +(R-L)/2;if (isblue(m)) {L = M;} else {R = M ;}
} return L/R //根据实际情况情况选择 

3.详细讲解

开始时,L指针和 R指针取在搜索区间界外,L=首个元素下标−1,R=末尾元素下标+1,此时所有元素均未着色;
循环条件始终为 L+1 < R,当 L=R 时跳出循环,此时蓝红区域划分完成,所有元素均已着色;
M指针取值始终为 M =(L+R)/2
L指针和 R指针变化的时候直接变为 M指针,即对 M 指针所指向元素进行染色,无需 +1 或者−1;
本模板唯一变化的地方是判断目标元素最终落在左边蓝色区域还是右边红色区域。以不变应万变,根据情况的不同,变换判断条件,大大的降低了出错的可能。以下还有一些我们需要注意到的说明

1.根据target的情况 < 、≤在左边蓝色区域找,≥ 、>在右边红色区域找

2.染色完成后的特殊情况:如果遍历完成后都为蓝色区域的话左边红色区域长度为 0 ,如果搜索目标位于左边红色区域,则搜索结果不存在,同理都为红色区域右边蓝色区域长度为 0 ,如果搜索目标位于右边蓝色区域,则搜索结果不存在一般需要后期处理。

3.普通技巧: 以下技巧必须掌握: 排序 二分查找的运用是建立在数组有序的基础上的,如果数组无序,我们要先对数组进行排序,如果数组有多个维度,我们针对需要二分查找的维度进行排序。 构造二分查找区间 当问题能够转化为区间内二分判定问题的时候,构造搜索区间,在蓝红二分法中设L指针初始为L0;R指针设为二分查找结束后L指针始终为Lt,R指针始终为Rt,target在(Lt--Rt)之间双指针 L 和 R 始终对目标元素 targettargettarget 进行夹逼,这是一条非常重要的性质。 如果开始构造搜索区间没有思路的时候,直接用题目提示中的数值区间!如果开始构造搜索区间没有思路的时候,直接用题目提示中的数值区间

4. 高阶技巧: 缩进边界构造区间 在第④条中,我们讨论了全蓝或者全红的特殊状态,其实我们可以提前判断,根据题意:

搜索区间第一个元素颜色待定,搜索区间最后一个元素颜色待定,L=首个元素下标−1,R=末尾元素下标+1,如区间为[0, n−1]则L=-1,R=N;

搜索区间第一个元素最终一定为蓝色,搜索区间最后一个元素颜色待定,L=首个元素下标,R=末尾元素下标+1,如区间为[0, n−1]则L=0,R=N;

搜索区间第一个元素颜色待定,搜索区间最后一个元素最终一定为红色L=首个元素下标−1,R=末尾元素下标,如区间为[0, n−1]则L=-1,R=N-1;

搜索区间第一个元素最终一定为蓝色,搜索区间最后一个元素一定为红色L=首个元素下标−1,R=末尾元素下标+1,如区间为[0, n−1]则L=-1,R=N;

4.实战演示

如力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

ca3a1a1acfaa4c69bbea5670d3b3d185.png

class Solution {public int searchRangeLeft(int[] nums, int target) {int left = -1;int right =nums.length;while (left+1 != right) {int mid = (left + right) / 2;if(nums[mid] <= target) {left = mid;}else {right = mid;}}return left;}public int searchRangeRight(int[] nums, int target) {int left = -1;int right =nums.length;while (left+1 != right) {int mid = (left + right) / 2;if(nums[mid] < target) {left = mid;}else {right = mid;}}return right;}public int[] searchRange(int[] nums, int target) {int leftIndex = searchRangeLeft(nums,target);int rightIndex = searchRangeRight(nums,target);if(leftIndex >= rightIndex && leftIndex < nums.length && nums[leftIndex] == target && nums[rightIndex] == target) {return new int[] {rightIndex,leftIndex};}return new int[] {-1,-1};}
}

以上就是我使用该模板的解决的一道题,读者有兴趣也可以去尝试一下,链接如下

34. 在排序数组中查找元素的第一个和最后一个位置

以上就是关于蓝红二分查找法的模板和内容了,当然如果你比较熟悉二分查找法的思想也可以自己做一个模板。

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

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

相关文章

毅速丨3D打印随形水路为何受到模具制造追捧

在模具制造行业中&#xff0c;随形水路镶件正逐渐成为一种革命性的技术&#xff0c;其提高冷却效率、优化产品设计、降低成本等优点&#xff0c;为模具制造带来了巨大的创新价值。 随形水路是一种根据产品形状定制的冷却水路&#xff0c;其镶件可以均匀地分布在模具的表面或内部…

JavaWeb学习(未完结)

文章目录 一、基本概念1.1 动态Web网站简介1.2 web应用程序1.3 静态web1.4 动态web 二、web服务器2.1 技术2.2 应用服务器2.3 安装 jdk8 三、Tomcat3.1 安装 Tomcat93.2 文件说明3.3 启动并使用Tomcat3.4 关闭Tomcat3.5 可能遇到的问题3.6 配置3.6.1 修改测试访问的网页地址3.6…

网站监控是什么

在当今高度互联的世界中&#xff0c;网站已成为企业和个人成功的关键因素。无论是提供产品或服务&#xff0c;还是建立品牌形象&#xff0c;网站都是不可或缺的工具。然而&#xff0c;随着互联网用户对访问速度和用户体验的高要求&#xff0c;保持网站的稳定性和可用性变得至关…

【深度学习】卷积神经网络结构组成与解释

卷积神经网络是以卷积层为主的深度网路结构&#xff0c;网络结构包括有卷积层、激活层、BN层、池化层、FC层、损失层等。卷积操作是对图像和滤波矩阵做内积&#xff08;元素相乘再求和&#xff09;的操作。 1. 卷积层 常见的卷积操作如下&#xff1a; 卷积操作解释图解标准卷…

案例024:基于微信小程序的汽车保养系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

基于ThinkPHP8 + Vue3 + element-ui-plus + 微信小程序(原生) + Vant2 的 BBS论坛系统设计【PHP课设】

一、BBS论坛功能描述 我做的是一个论坛类的网页项目&#xff0c;每个用户可以登录注册查看并发布文章&#xff0c;以及对文章的点赞和评论&#xff0c;还有文件上传和个人签名发布和基础信息修改&#xff0c;管理员对网站的数据进行统计&#xff0c;对文章和文件的上传以及评论…

MobileNets发展

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 引言MobileNetsMobileNet - V1思想代码实现 MobileNet - V2思想代码实现 MobileNet - …

基于协作搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于协作搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于协作搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于协作搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

气膜厂家如何确保质量?

气膜厂家是专门生产和销售气膜产品的企业&#xff0c;需要对产品的质量进行有效管理和控制&#xff0c;以确保产品能够满足客户的需求和期望。下面将从生产过程、质量控制手段和售后服务等方面介绍气膜厂家如何确保产品质量。 起初&#xff0c;气膜厂家需要建立完善的质量管理…

MIT6.824-Raft笔记:Raft初探、副本间log时序

从宏观角度说明raft在程序中的作用&#xff0c;和客户端的关系&#xff0c;以及多个副本之间的关系&#xff1b;从微观角度说明多个副本之间raft对日志处理的流程。 1. Raft 初探 宏观角度说明raft在程序中的作用&#xff0c;和客户端的关系&#xff0c;以及多个副本之间的关…

项目环境配置 本地/测试/预发/生产

在本地目录下新建文件 dev测试环境 development 本地开发环境 production 生产环境 uat预发布环境 .env.dev VUE_APP_API_PATH /api # 测试 VUE_APP_API_PATH http:// # 生成dist名称 VUE_APP_DIST dist_dev .env.development # 本地开发环境 VUE_APP_API_PATH…

探究Kafka原理-3.生产者消费者API原理解析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…

续新的SSL证书

一、重新申请证书并下载证书&#xff1a; https://www.ename.net/ 二、IIS中在【服务器证书】中删除旧的证书&#xff0c;导入新的证书&#xff1b; 三、在站点的绑定选择新证书&#xff1b;

力控软件与多台PLC之间ModbusTCP/IP无线通信

Modbus TCP/IP 是对成熟的 Modbus 协议的改编&#xff0c; 因其开放性、简单性和广泛接受性而在工业自动化系统中发挥着举足轻重的作用。它作为连接各种工业设备的通用通信协议&#xff0c;包括可编程逻辑控制器 (PLC)、远程终端单元 (RTU) 和传感器。它提供标准化的 TCP 接口&…

互联网时代的身份标识有哪些?

在互联网时代&#xff0c;我们的在线活动几乎都与IP地址相关。无论是浏览网页、观看视频&#xff0c;还是进行在线交易和沟通交流&#xff0c;我们的设备都会分配到一个独特的IP地址。然而&#xff0c;你可能并未意识到的是&#xff0c;IP地址不仅标识了我们在网络中的身份&…

[UE4][C++]基于UUserWidget的一种序列图播放方法

最近在做一个大项目&#xff0c;鸽了几个月了....... 一、传统方法Flipbook 这种方法适合序列图较少的情况下、可以一个一个添加进来然后调整顺序。蓝图也比较友好可以直接设置很多属性和功能。这里简单了解一下即可&#xff0c;想要深入了解的同学可以自行搜索。 1.1创建Fli…

Unity 讯飞 之 讯飞星火大模型的简单封装和使用(补充讯飞大模型识图功能)

Unity 讯飞 之 讯飞星火大模型的简单封装和使用&#xff08;补充讯飞大模型识图功能&#xff09; 目录 Unity 讯飞 之 讯飞星火大模型的简单封装和使用&#xff08;补充讯飞大模型识图功能&#xff09; 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、案例简单…

【外贸干货】领英客户开发与营销的六个策略方向

领英(LinkedIn)已经成为外贸营销人员&#xff0c;尤其是B2B外贸营销人员&#xff0c;一个重要且有效的社交媒体平台。 相比于其他社交媒体平台&#xff0c;领英(LinkedIn)在增加流量、产生高质量的潜在客户和建立思想领导力方面有着独有的优势。 因为领英(LinkedIn)不仅仅是获…

Harmony开发 eTs公共样式抽取

Harmony系统开发使用eTs开发过程中对于样式相同且重复使用的样式可以抽取成公共样式循环利用&#xff0c;类似于android的style样式。 import router from ohos.router import cryptoFramework from ohos.security.cryptoFramework; import prompt from system.prompt class L…

【LLM_04】自然语言处理基础_2

一、神经网络1、循环神经网络&#xff08;RNN&#xff09;2、门控循环单元&#xff08;GRU&#xff09;3、长短期记忆网络&#xff08;LSTM&#xff09;4、双向RNN5、卷积神经网络&#xff08;CNN&#xff09; 二、注意力机制1、注意力机制原理介绍2、注意力机制的各种变式3、注…