算法基础之二分查找

原题链接

一 、二分查找中的mid+1和mid-1的问题

二分查找中的边界问题处理不好很容易导致死循环和计算错误的问题,以题目 数的范围为例。

  • 题目大意

​ 二分查找重复数第一次出现的位置和最后一次出现的位置。

  • 数学含义

​ 第一次位置即 找到 一个长度最大的 >=X 区间的 左边界

​ 最后一次位置即 找到一个长度最大的 >= X 区间的右边界

注意 找的目标是左边界或者右边界 不是找整个区间

  • 图形示意

    L=左边界 R=有边界 M=中间值(所选比较的数)T=目标位置

    M的意义在于通过缩小区间 找到位置T

image-20230905221643547

  • 重要结论

    重要的一步是将M的值传递出去时候,即 L=M 或者R = M,即把目标范围的左或右边界设置为M。

    因为不管是M+1或者是M-1 ,指针都会移动。直接赋值M的时候,指针可能不会移动,就会造成死循环。

二、具体代码分析

找第一次出现的位置

  • 循环结束的条件 L==R,最后一次循环时 L+1==R,即搜索的目标范围内有两个元素。
  • M 为L+R的下取整,有可能取到L,不可能取到R,但是赋值是赋给R,即R=L,最终条件 L==R 会结束循环。
int l = 0, r = n - 1;
while (l < r) {int mid = l + r >> 1;if (a[mid] < x)  l = mid + 1;else    r = mid;
}

找最后一次出现的位置

  • 方法一 以【0,n-1】闭区间,最小搜索范围是2个元素,取右边界

    因为M的值是赋给L的,即L=M,所以M不能取到左边界,所以要向上取整。

所谓的闭区间 ,个人理解最后一次循环时只有两个元素,左右指针在这两个数之间移动。

image-20230905224331820

int l = 0, r = n - 1;
while (l < r) {int mid = l + r + 1 >> 1;if (a[mid] <= x)  l = mid;else    r = mid-1;
}
  • 方法二 以【0,n) 左闭右开区间 ,最小搜索范围是3个元素,取中间元素

    所谓左闭右开区间,个人理解需要加上循环上的判断控制,才能形成开区间效果,使得最后一次循环时只有三个元素,左右指针在第一、第二个数直接移动。

    由于l +1 < r 保证了最小搜索范围是3个元素,所以 l + r >> 1 时M会取到L和R中间的数,不会取L或者R,主要保证不能取到L。

    image-20230905225702420

int l = 0, r = n ;
while (l +1 < r) {int mid = l + r  >> 1;if (a[mid] <= x)  l = mid;else    r = mid; // 想想此处可不可以写成 r=mid-1
}

第一次位置 左闭区间0开始

int l = 0, r = n - 1;
while (l < r) {int mid = l + r >> 1;if (a[mid] < x)  l = mid + 1;else    r = mid;
}
  • 方法三 以(-1,n)左开右开区间

左开是为了求第一次出现位置,同样保证最后一次循环是3个元素, l + r >> 1 时M会取到L和R中间的数,不会取L或者R,主要保证不能取到R,因为找第一次位置主要是将M赋值给R。

第一次位置

int l = -1, r = n - 1;
while (l+1 < r) {int mid = l + r >> 1;if (a[mid] < x)  l = mid ;else    r = mid;
}

最后一次位置

while (l+1 < r) {int mid = l + r >> 1;if (a[mid] <= x)  l = mid ;else    r = mid;
}

完整代码

需要注意最后输出

第一次坐标 的二分的边界定为 左边为=X 则所求为R

最后一次坐标的二分边界定位 左边为<=X 右边>X 则所求为L

#include<iostream>
using namespace std;
const int N=1e5+5;
int n,m,q[N];
int main()
{scanf("%d %d",&n,&m);for(int i=0;i<n;i++) scanf("%d",&q[i]);while(m--){int k;scanf("%d",&k);//寻找第一个等于K的坐标 我这边让二分的边界定为 左边为<5 右边>=5 则所求为rint l=-1,r=n;while(l+1<r)//当l与r没有相接的时候,求边界{int mid=l+r>>1;//下面找第一个>=5的坐标if(q[mid]>=k) r=mid;else l=mid;}//此时得到的r是第一个>=5的坐标if(q[r]!=k) {printf("-1 -1\n");continue;}int ll = r,rr = n;while(ll+1<rr){int mid=ll+rr>>1;if(q[mid]<=k) ll=mid;else rr=mid;}printf("%d %d\n", r, ll);}}

三、个人心得体会

开区间 其实就是 最小搜索范围是3元素+左右新增点 的方式。这样就避免了L=M或者R=M 的死循环问题。

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

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

相关文章

golang入门笔记——pprof性能分析

文章目录 简介runtime/pprof的使用命令行交互网络服务性能分析pprof与性能测试结合压测工具go-wrk 简介 golang性能分析工具pprof的8个指标 1.性能分析的5个方面&#xff1a;CPU、内存、I/O、goroutine&#xff08;协程使用情况和泄漏检查&#xff09;、死锁检测以及数据竟态…

医院电子病历编辑器,EMRE(EMR Editor)源码

电子病历主要面向医院机构医生、护士&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。本系统基于云端SaaS服务方式&#xff0c;通过浏览器方式访问和使用系统功能&#xff0c;提供电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;为医疗…

asisctf 2023 web hello wp

hello 开题&#xff0c;直接给了源码。 <?php /* Read /next.txt Hint for beginners: read curls manpage. */ highlight_file(__FILE__); $url file:///hi.txt; if(array_key_exists(x, $_GET) &&!str_contains(strtolower($_GET[x]),file) && !str_c…

TVP专家谈腾讯云 Cloud Studio:开启云端开发新篇章

导语 | 近日&#xff0c;由腾讯云 TVP 团队倾力打造的 TVP 吐槽大会第六期「腾讯云 Cloud Studio」专场圆满落幕&#xff0c;6 位资深的 TVP 专家深度体验腾讯云 Cloud Studio 产品&#xff0c;提出了直击痛点的意见与建议&#xff0c;同时也充分肯定了腾讯云 Cloud Studio 的实…

el-table 指定层级展开

先来看看页面默认全部展开时页面的显示效果&#xff1a;所有节点被展开&#xff0c;一眼望去杂乱无章&#xff01; 那么如何实现只展开指定的节点呢&#xff1f;最终效果如下&#xff1a;一眼看去很舒爽。 干货上代码&#xff1a; <el-table border v-if"refreshTabl…

ROS2 从头开始:第 5 部分 - 并发、执行器和回调组

一、说明 让我们回到基础。并发意味着系统或软件可以同时运行许多任务。例如,在单核 CPU 机器上,可以通过使用线程来实现并发。本文探讨了

基于边缘智能网关的储充一体电站管理方案

在“2030碳达峰&#xff0c;2060碳中和”的目标下&#xff0c;我国持续加快推进能源转型&#xff0c;扩大新能源占比&#xff0c;全国各地都在部署建设光伏、储能、新能源汽车充电等应用。随着新能源汽车的广泛普及&#xff0c;充电站、充电桩的需求快速增加&#xff0c;行业也…

分享从零开始学习网络设备配置--任务3.8 使用动态路由OSPF实现网络连通

任务描述 某公司随着规模的不断扩大&#xff0c;路由器的数量在原有的基础上有所增加。网络管理员发现原有的路由协议已经不适合现有的网络环境&#xff0c;可实施动态路由OSPF协议配置&#xff0c;实现网络中所有主机之间互相通信。因为动态路由OSPF协议可以实现快速收敛&…

zabbix实现钉钉报警

首先钉钉创建一个团队 自定义关键词 查看zabbix-server脚本存放的位置&#xff1a; [rootcontrolnode ~]# grep ^AlertScriptsPath /etc/zabbix/zabbix_server.conf AlertScriptsPath/usr/lib/zabbix/alertscripts zabbix server设置 在配置文件书写脚本目录vim /etc/za…

Redis的softMinEvictableIdleTimeMillis和minEvictableIdleTimeMillis参数

背景&#xff1a; Redis的softMinEvictableIdleTimeMillis&#xff0c;minEvictableIdleTimeMillis是一个令人疑惑两个参数&#xff0c;特别是当它和minIdle组合起来时就更难理解了&#xff0c;本文就来梳理下他们的之间的关系 softMinEvictableIdleTimeMillis&#xff0c;mi…

最新AI写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt+MJ以图生图+思维导图生成

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

华为乾坤区县教育安全云服务解决方案(1)

华为乾坤区县教育安全云服务解决方案&#xff08;1&#xff09; 课程地址方案背景客户痛点分析区县教育网概述区县教育网业务概述区县教育网业务安全风险分析区县教育网安全运维现状分析区县教育网安全建设痛点分析 安全解决方案功能概述架构概述方案架构设备选型 课程地址 本…

系统架构设计师(第二版)学习笔记----软件工程

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----软件工程 文章目录 一、软件工程1.1 软件危机的表现1.2 软件工程的内容 二、软件过程模型2.1 软件的声明周期2.2 瀑布模型2.3 瀑布模型的缺点2.4 原型模型2.5 原型模型开发阶段2.6 开发原型的途径2.7 螺旋…

OpenCV实现FAST算法角点检测 、ORB算法特征点检测

目录 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 非极大值抑制 1.3 代码实现 1.4 结果展示 2 &#xff0c;ORB算法 2.1代码实现 2.2 结果展示 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 …

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 数据增强3. 模型构建4. 模型训练及保存1&#xff09;模型训练2&#xff09;模型保存 5. 模型评估 相关其它博客工程源代码下载其它资料下载 前言 本项目依赖于Keras深度学习模型&#xff0c;旨在对…

Mybatis-Flex框架初体验

本篇文章内容主要包括&#xff1a; MyBatis-Flex 介绍 MyBatis-Flex 是一个优雅的 MyBatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用Mybaits-Flex链接任何数据库&#xff0c;其内置的QueryWrapper亮点帮助我们极大的减少了SQL编写的工…

企业虚拟化KVM的三种安装方式(1、完全文本2、模板镜像+配置文件3、gustos图形方式部署安装虚拟机)

一、安装完虚拟机后的操作 第一步: 第二步&#xff1a;分配的内存大一下&#xff0c;处理器多些 第三步&#xff1a;打开虚拟化 打开虚拟机、安装KVM 一般企业如果使用kvm虚拟化平台&#xff0c;都会把物理服务器装成Centos的操作系统&#xff0c;然后装上kvm&#xff0c;创建…

crypto:摩丝

题目 根据题目所给的压缩包下载后解压&#xff0c;打开文本提示 摩斯密码&#xff0c;对照表可解码得到flag

时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测

时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测 目录 时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测&#…

Cesium 问题:三维场景下添加的实体会被遮挡

文章目录 问题分析 问题 在三维场景下&#xff0c;我们添加的实体会被遮挡导致显示不够完整&#xff0c;例如 而应该的效果如下 分析 在三维场景中&#xff0c;实体可能会被以下几类物体或因素所遮挡&#xff1a; 地形&#xff1a;如果实体位于地球表面附近&#xff0c;地形…