二分查找-边界条件讨论

题目:二分查找

存在问题的地方:

  • 边界条件while(left __ right)中是 < 还是 <=
  • 循环中if(nums[middle] > target) right = _____中是middle还是middle - 1

应该在区间上讨论:

  • 左闭右闭:[ left , right ]
  • 左闭右开:[ left , right )
  • 左开右闭:( left , right ]
  • 等等情况…

[ left , right ]时

初始:

left = 0
right = numsize - 1

目标:找target,有返回下标,没有返回-1
然后进入 while(left ____ right) 小于还是小于等于的 讨论
首先看区间定义,以左闭右闭的区间来写二分法代码。那么观察写小于等于在这个区间里是不是一个合法的区间。什么是合法区间,至少要符合这个区间的定义才是。小于等于也就是说多了一个left和right相等的情况,在这个区间内合不合法,举个例子数组只有1个元素1 那么 [ left , right ] 即 [ 1 , 1] ,合法

然后进行循环的查找

while(left <= right){ //1. < 还是 <=middle = (left + right) / 2;if(nums[middle] > target)right = ______;  //2. middle 还是 middle - 1...
}

这是左闭右闭的一个区间,已经判断middle所在的值大于target,说明nums[middle]一定不是我们搜索的值。所以我们接下里的区间是一定不要包含这个数值,即 [left , middle - 1]

if(nums[middle] > target)right = middle - 1;//middle 还是 middle - 1

此时如果写middle的话,[ left , middle ] 包含了这个nums[middle],而条件已经判断了nums[middle]>target了,此时把不是自己搜索区间里面的值又放到了下一个循环里边接着去搜索了,此时边界处理有问题。

if(nums[middle] > target)right = middle;//如果写middle

[ left , right )时

在这个区间里显然left和right不能相等,举例 [ 1 , 1)
开的意思就是不包含右边的这个边界,闭的意思就是包含左边的这个边界。又包含1又不包含1,不是一个合法的区间

while(left < rifht)

然后再来看下区间 [ left , right)
就是不包含right这个数值,此时nums[middle]已经大于target了,说明下一个搜索的左区间是不包含这个middle所在的数值。那么接下来的搜索区间本来就不包含right,那么right正好等于middle,在这个新的左区间里进行搜索。

if(nums[middle] > target)right = middle;

而此时如果target大于nums[middle],左闭右开的区间包含了左边界这个值,此时已经明确nums[middle] < target,middle不是我的target,那么接下来的区间不能包含这个middle,所以接下来的区间是[ middle + 1 , right),这才是一个新的我们要搜索的区间,符合我们左闭右开的一个原则。

else if(nums[middle] < target)left = middle + 1;

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

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

相关文章

二维字符型数组算法整理

1. 二维字符串数组的冒泡排序 #include <stdio.h> #include <string.h>int main(void) {char str[5][32] {0};int i 0;int j 0;char tmp[32] {0};for (i 0; i < 5; i){gets(str[i]);}for (i 0; i < 4; i){for (j 0; j < 4-i; j){if (strcmp(str[j…

【软件安装】(十六)双系统Ubuntu22.04引导启动菜单的默认项

一个愿意伫立在巨人肩膀上的农民...... 好学的人总是喜欢在电脑上安装双系统&#xff0c;可是安装好系统之后&#xff0c;就会出现默认启动优先级的苦恼&#xff0c;如果在Bios中设置Windows引导启动为优先启动&#xff0c;那么每次想要进如Ubuntu系统就都需要重新设置Bios。如…

TP6.0 命令行生成类库文件

1. 生成控制器 // 默认生成资源控制器&#xff0c;有七个方法资源操作方法// index、create、save、read、edit、update、deletephp think make:controller Blog// 创建多级控制器php think make:controller user/Blog// 创建index应用下的Blog控制器php think make:controller…

[Vue warn]: useModel() called with prop “xxx“ which is not declared

我们在使用vue3里面的defineModel的时候可能会出现这个问题&#xff0c;原因是我们使用的 kebab-case 形式的属性名&#xff0c;我也不知道是不是vue3设定这个api的时候设置的不支持&#xff0c;我没找到相关文档&#xff0c;不过我们把 kebab-case 的形式改为 驼峰命名法 或者…

YOLOv8 训练自己的数据集(20240423)

环境搭建请参考&#xff1a;Win10 搭建 YOLOv8 运行环境&#xff08;20240423&#xff09;-CSDN博客 环境测试请参考&#xff1a;本地运行测试 YOLOv8&#xff08;20240423&#xff09;-CSDN博客 一、使用 YOLOv8 的 coco128 数据集熟悉一下如何训练和预测 1.1、在项目根目录…

ClickHouse用UDF解析XML字符串和XML文件

一.如果是读取xml文件的时候&#xff0c;文件入库需要使用文件读取UDF 创建了1个测试文件 wsdFileRead()&#xff1a; 直接读取文件内容 SELECT wsdFileRead(/home/temp/wsd_test.xml)Query id: 09b6e5fe-7169-43f7-b001-90e2eeabb8da┌─wsdFileRead(/home/temp/wsd_test.xm…

广州大学《虚拟现实与游戏开发》实验报告一HTC-VR环境搭建与开发

广州大学学生实验报告 开课实验室&#xff1a; 学院 年级、专业、班 姓名 学号 实验课程名称 虚拟现实与游戏开发 成绩 实验项目名称 1. HTC-VR环境搭建与开发 指导老师 实验目的 HTC VIVE硬件安装虚拟现实开发环境搭建 3.熟悉虚拟现实硬件系统和…

串口服务器和光纤交换机的区别

串口服务器与光纤交换机在功能和应用上存在显著区别。串口服务器主要实现串口设备与以太网设备之间的数据转换与传输&#xff0c;适用于远程监控、数据采集等场景&#xff1b;而光纤交换机则专注于高速光纤网络中的数据交换&#xff0c;为大型企业或数据中心提供稳定、高效的数…

基于SpringBoot的合家云社区物业管理平台 - 权限管理模块开发

合家云社区物业管理平台 4.权限管理模块开发 4.1 权限管理概述 4.1.1 权限管理的意义 后台管理系统中&#xff0c;通常需要控制不同的登录用户可以操作的内容。权限管理用于管理系统资源&#xff0c;分配用户菜单、资源权限&#xff0c;以及验证用户是否有访问资源权限。 …

16:事务-Java Spring

目录 16.1 Spring事务管理原理16.2 Spring事务配置与代码示例16.3 事务策略的区别16.4 Spring事务应用场景总结 16.1 Spring事务管理原理 Spring事务管理基于AOP&#xff08;面向切面编程&#xff09;实现&#xff0c;通过拦截方法调用&#xff0c;对业务逻辑进行增强&#xf…

开源模型应用落地-chatglm3-6b-集成langchain(十)

一、前言 langchain框架调用本地模型&#xff0c;使得用户可以直接提出问题或发送指令&#xff0c;而无需担心具体的步骤或流程。通过LangChain和chatglm3-6b模型的整合&#xff0c;可以更好地处理对话&#xff0c;提供更智能、更准确的响应&#xff0c;从而提高对话系统的性能…

构建企业信息安全防护体系:以电子文档安全为核心

随着信息社会的飞速发展与企业信息化建设的深入&#xff0c;企业的商业机密已从传统的纸质文件转向各类电子文档&#xff0c;如CAD图纸、Office文档等。这些数字化的信息载体在提升工作效率、便捷信息流转的同时&#xff0c;也成为了企业内部数据安全面临的主要挑战。如何有效地…

基于springboot实现中药实验管理系统设计项目【项目源码+论文说明】

基于springboot实现中药实验管理系统设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足&#xff0c;创建了一个计算机管理中药实验管…

LeetCode-2385. 感染二叉树需要的总时间【树 深度优先搜索 广度优先搜索 二叉树】

LeetCode-2385. 感染二叉树需要的总时间【树 深度优先搜索 广度优先搜索 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;记录父节点 DFS解题思路二&#xff1a;解题思路三&#xff1a;深度优先搜索建图 广度优先搜索求感染时间【最容易理解】 题目描述&#xff1a; 给…

Python 将Influxdb时序数据写入mysql库时遇到的问题

使用python的 influxdb、pandas、pymysql模块&#xff0c;将influxdb的时序数据&#xff0c;抽取到myl中。 使用influxdb模块中的DataframeClient初始化一个连接实例&#xff0c;然后通过实例的quey()方法&#xff0c;执行influxQL查询&#xff0c;查询需要的数据&#xff0c;…

springboot如何返回中文json,保证顺序。LinkedHashMap应用实例

在业务中有时候需要中文json去进行映射到有些UI上&#xff0c;而springboot都是英文字段 //通过id查询消火栓的基本信息和检测值给POIGetMapping("/queryPOIForHydrant")ApiOperationSupport(order 4)ApiOperation(value "查询所需要的消火栓数据渲染给POI&qu…

实现Spring底层机制(三)

文章目录 阶段4—实现BeanPostProcessor机制1.文件目录2.初始化方法实现1.编写初始化接口InitializingBean.java2.MonsterService.java实现初始化接口3.容器中的createBean方法增加初始化逻辑&#xff0c;判断对象类型是否是InitializingBean的子类型&#xff0c;如果是&#x…

FRP远程连接

前言 通过frp和跳板机完成局域网服务器访问。工具地址&#xff1a;https://github.com/fatedier/frp 配置frp过程 下载frp工具&#xff0c;下载地址如下&#xff1a; https://github.com/fatedier/frp/releases 这里我选择了v0.57.0 解压到本地路径 tar -zxvf xxxxxx.tar.gz配…

python爬虫学习第二十八天-------了解scrapy(二十八天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

接口测试和Mock学习路线(中)

1.什么是 swagger Swagger 是一个用于生成、描述和调用 RESTful 接口的 WEB 服务。 通俗的来讲&#xff0c;Swagger 就是将项目中所有想要暴露的接口展现在页面上&#xff0c;并且可以进行接口调用和测试的服务。 现在大部分的项目都使用了 swagger&#xff0c;因为这样后端…