day1-二分查找

news2024/9/26 1:28:09

二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

思路

这是一道非常经典且简单的题目,虽然简单,但是要深刻理解却要花费一些功夫。
这道题大多数人只能写出一种写法,也分不清区间闭合和不闭合之间的差别。

闭合区间

什么叫闭合区间,就是目标target在区间[left, right]中,这个区间是包含left和right的。
这一点造成的差别是,我们在搜索时区间的变化和循环的终止条件。
当nums[mid] < target时,right 将等于 mid -1 ,因为此时nums[mid] 是绝对不等于 target的。
第二点差别是循环的终止条件应该为left > right,因为区间包括两端,也就是left == right时依旧有效。
因此完整代码应该如下:

int search(vector<int>nums,int target)  
{  
    int left = 0, right = nums.size()-1;  
    int mid = -1;  
    while (left <= right)  
    {  
        mid = (left + right)>>1;  
        if (nums[mid] > target)  
            right = mid-1;  
        else if (nums[mid] < target)  
            left = mid+1;  
        else  
            return mid;  
    }  
    return -1;  
}

半闭合区间

无论是[left,right) 也好还是 (left, right],都是半闭半开的区间。其实原理是一样的,只不过在于写法不同。
其实半闭合可以理解为[left, right-1]或者[left-1, right],因此上面的终止条件和区间的变化要改一下。
这里以[left, right)为例子。

int search(vector<int>nums,int target)  
{  
    int left = 0, right = nums.size(); //right等于长度 + 1    int mid = -1;  
    while (left < right) //left == right时不再有意义  
    {  
        mid = (left + right)>>1;  
        if (nums[mid] > target)  
            right = mid;  
        else if (nums[mid] < target)  
            left = mid+1;  
        else  
            return mid;  
    }  
    return -1;  
}

第一点区别是终止条件改为left < right,原因是因为left = right是不再有意义,有意义的应该是left == right-1。
第二点是区间的变化,当**if (nums[mid] > target) **时,right 应该 赋值为mid。
其他地方都是一样的。

在这里插入图片描述

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

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

相关文章

单片机基于stm32单片机的数字温度计设计_kaic

摘 要 古往今来,陶瓷在我们的生活中一直都是不可或缺的物品,而随着当今社会经济的快速发展,人们对于这些高档陶瓷产品的使用性能和产品质量上的要求也愈加严格。那么在陶瓷品的生产过程中,想要提高陶瓷品的品质和合格率,能够随时监测温度的温度计是必不可少的。 本课题的研究是…

什么是IP地址定位技术

IP地址定位是一种技术手段&#xff0c;可以通过获取设备的IP地址精确定位设备的地理位置。它在现代社会的许多方面都有广泛的应用&#xff0c;包括网络安全、广告投放市场调研等。 在互联网时代&#xff0c;人们越来越依赖于网络而IP地址作为网络连接的基石扮演着重要的角色。…

什么软件支持快速批量处理大量视频素材呢

在视频剪辑的过程中&#xff0c;有时候为了满足视频时长的需求&#xff0c;或者为了实现视频与音频的同步操作&#xff0c;我们可能需要对视频的播放速度进行调整。如果需要处理大量的视频文件&#xff0c;传统的手动一个个调整的方法就显得有点落后了&#xff0c;今天小编要与…

JDBC事务特性

1、 事务的四种特性&#xff08;ACID&#xff09; 原子性&#xff08;Atomicity&#xff09;&#xff1a;原子性是指事务是一个不可分割的执行单元或者叫工作单位&#xff0c;事务中的操作&#xff0c;要么都发生&#xff0c;要么都不发生。 一致性&#xff08;Consistency&am…

centos7.9 安装redis5.0.7记录

参考自己之前写的安装5.0.3 centos7安装redis5.0.3详细步骤_lanren312的博客-CSDN博客 一开始大意了&#xff0c;没有安装gcc&#xff0c;直接就make [rootlocalhost redis-5.0.7]# make cd src && make all make[1]: Entering directory /opt/redis-5.0.7/srcLINK re…

Docker 多架构镜像介绍和最佳实践

Docker 多架构镜像介绍和最佳实践> 更多云原生相关技术分享请关注公众号&#xff1a;CloudNativeOps &#xff1b; 添加微信 GoOps888&#xff0c;备注 ‘加群’ 可加入云原生技术交流群。 一、多架构镜像介绍 在 Docker 中&#xff0c;同一个 Docker 镜像可以在不同的平台…

rosserial协议通信--向ros写调用过程和读取数据调用过程

rosserial通信向ros写调用过程如下&#xff1a; 在32单片机中&#xff0c;发布者调用publish函数&#xff0c;然后依次逆向&#xff08;上图是分析过程&#xff1b;调用过程逆向&#xff09;查看上图&#xff0c; 最终操作串口&#xff0c;向上位机发布数据进行通信。 rosser…

代码随想录第24天 | ● 93.复原IP地址 ● 78.子集 ● 90.子集II

93.复原IP地址 /*** param {string} s* return {string[]}*/ let road [];let path [];var restoreIpAddresses function (s) {road [];if (s.length > 12 || s.length < 4) return [];//开始就判断&#xff0c;长度大于12的字符窜或者小于4的都不行backtracking(s,…

漏洞复现 || Apache RocketMQ 远程代码执行

技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的…

Spring原码学习第一篇:Spring概述

1、Spring源码概述图&#xff1a; 2、一些重要的接口 3、Spring获取对象的过程 BeanDefinition中实现的方法&#xff0c;把xml中定义的对象封装为一个对象&#xff0c;方便后面处理 4、BeandefinitionReader BeandefinitionReader作为一个抽象层来处理配置文件&#xff0c;定…

unity插件 -- UiEffect for UGUI

目录 1.简介 2. 脚本 3. 在线观看Demo 4.安装要求 5.使用方法 6.使用场景 7.插件下载 1.简介 UIEffect-upm是Unity中的一个插件&#xff0c;用于实现各种UI特效。它提供了许多常见的UI效果&#xff0c;如模糊、描边、阴影、发光等&#xff0c;可以轻松地为UI元素增添动…

Vue3子组件向父组件传递消息

父子组件之间的通信&#xff1a;props与emit 通常提到props&#xff0c;都会想到的是父组件给子组件传值&#xff1b;提到emit为子组件向父组件发送消息&#xff0c;但其实&#xff0c;props也可以使子组件向父组件传递消息 方式为在父组件中通过为子组件绑定属性&#xff0c…

代谢组学数据分析及网络药理学研究技术与实践

代谢组学是近年发展快速的一门学科&#xff0c;目前在医学、植物学、微生物学、毒理学、药物研发等多个领域中得到了广泛的应用。如何从复杂的代谢组学数据中提取出有价值的信息&#xff0c;筛选出潜在的生物标志物成为近年来代谢组学研究的热点和难点。网络药理学能够通过计算…

基于STM32的熏艾式空气消毒装置设计与实现(华为云IOT)

一、前言 艾叶自古以来都在中医中占据着重要地位,特别是在那个瘟疫横行、卫生设施条件落后的时代。而在如今的疫情时代,艾叶的实用功能依旧可以为我们所用。考虑到技术的发展,我们是否可以利用现代技术的高效性来对艾叶进行更加科学利用呢?可编程的嵌入式系统与传感器结合…

Linux学习之管道

管道和信号一样&#xff0c;也是进程通信的方式之一。匿名管道&#xff0c;也称为管道符&#xff08;“|”&#xff09;&#xff0c;用来把上一个命令的输出当成下一个命令的输入。使用vim pipeContent.txt&#xff0c;把下边的内容 1 11 2 22 3 33 4 44 5 6 7 8 9写到Redirec…

基于simulink从视频序列创建马赛克(附源码)

一、前言 此示例演示如何从视频序列创建马赛克。视频拼接是将视频帧拼接在一起以形成场景综合视图的过程。生成的马赛克图像是视频数据的紧凑表示。视频马赛克块通常用于视频压缩和监控应用。 此示例说明如何使用“角检测”块、“估计几何变换”块、“投影变换”块和“合成”…

Vue3+Vite+Pinia+Naive后台管理系统搭建之四:Naive UI 组件库的安装和使用

前言 如果对 vue3 的语法不熟悉的&#xff0c;可以移步 Vue3.0 基础入门Vue3.0 基础入门快速入门。 UI 组件请参考官网&#xff1a;Naive Ui 官网 1. 安装依赖 yarn add naive-ui -D // or npm install naive-ui -D 2. 在 SFC (单文件组件) 中使用 直接引入&#xff08;推…

UnsatisfiedDependencyException: Error creating bean with name “dataSource” 异常排查

在写demo过程中&#xff0c;出现此异常&#xff0c;自己是按照以下步骤一个一个进行排查最终解决问题&#xff0c;希望能帮到碰到此问题的同学 : ) 1. 检查配置文件是否设置正常&#xff0c;是否配置了扫描类和配置文件路径 2. 检查是否设置MapperScan注解 3. 检查驱动版本和s…

c语言的变量

变量 我们可以直接声明一个变量&#xff0c;并利用这些变量进行基本的运算&#xff0c;声明格式为: 数据类型 变量名称 初始值&#xff1b; // 其中初始值可以不用定义变量时设定 // 是赋值操作&#xff0c;可以将等号后面的值赋值给前面的变量&#xff0c;等号后面可以直接…

SpringMVC集合

目录 SpringMVCSpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 SpringMVC入门&#xff08;1&#xff09;引入依赖&#xff08;2&#xff09;配置web.xml&#xff08;3&#xff09;创建请求控制器&#xff08;4&#xff09;创建SpringMVC的配置文件&#xff08…