编程题-二分查找

题目:

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

解法一(循环遍历查找):

直接循环遍历数组中的所有元素,利用for循环进行查找,存在则直接输出下标,若遍历完成后仍未找到,则函数返回-1值,如下为代码:

class Solution {
public:int search(vector<int>& nums, int target) {int length =nums.size();for(int i=0;i<length;i++){if(nums[i]==target){return i;}}return -1;}
};

解法二(二分查找):

在升序数组nums中寻找目标值target,对于特定下标i,比较nums[i]和target的大小:

1、如果nums[i]=target,则下标i即为要寻找的下标;

2、如果nums[i]>target,则target只可能在下标i的左侧;

3、如果nums[i]<target,则target只可能在下标i的右侧;

基于上述事实,可以在有序数组中使用二分查找寻找目标值。

二分查找的做法是,定义查找的范围[left,right],初始查找范围是整个数组。每次取查找范围的中点mid,比较nums[mid]和target的大小,如果相等则mid即为要寻找的下标,如果不相等则根据nums[mid]和target的大小关系将查找范围缩小一半。

由于每次查找都会将查找范围缩小一半,因此二分查找的时间复杂度是O(logn),其中n是数组的长度。二分查找的条件是查找范围不为空,即left≤right。如果target在数组中,二分查找可以保证找到target,返回target在数组中的下标。如果target不在数组中,则当left>right时结束查找,返回-1。如下为二分查找的代码:

class Solution {
public:int search(vector<int>& nums, int target) {//定义数组首部left和尾部right的下标值,以下中间数记录和查找元素均以下标形式记录int left = 0, right = nums.size() - 1;while(left<=right){int mid = (right-left)/2+left;int num = nums[mid];//中间数刚好是target时直接return输出下标结果if(num==target){return mid;}//若target小于num,则将right下标值移动至中间数的前一位else if(num>target){right = mid-1;}//若target大于num,则将left下标移动至中间数的后一位else if(num<target){left = mid+1;}}return -1;}
};

笔者小记:二分查找时,应通过数组的首部和尾部下标值计算得到中间数的下标值,所有对数组元素的记录都应该以索引位置下标值作为依据,而不是通过数组的长度length为依据进行计算,极容易会产生元素索引值的错误。简单来说,nums.size()得到的数组长度仅仅作为赋right数组尾初始索引值的计算依据,而后续数组的首部和尾部也应通过下标索引计算得到,而不能通过数组长推算得到。

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

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

相关文章

关于大数据的基础知识(一)——定义特征结构要素

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于大数据的基础知识&#xff08;一&a…

【git】-2 分支管理

目录 一、分支的概念 二、查看、创建、切换分支 1、查看分支-git branch 2、创建分支- git branch 分支名 3、切换分支- git checkout 分支名 三、git指针 -实现分支和版本间的切换 四、普通合并分支 git merge 文件名 五、冲突分支合并 ​​​​​​【git】-初始gi…

Maven核心插件之maven-resources-plugin

前言 Maven 插件是 Maven 构建系统的重要组成部分&#xff0c;它们为 Maven 提供了丰富的功能和扩展能力&#xff0c;使得 Maven 不仅是一个构建工具&#xff0c;更是一个强大的项目管理平台。在 Maven 项目中&#xff0c;插件的使用通常通过配置 pom.xml 文件来完成。每个插件…

[云原生之旅] K8s-Portforward的另类用法, 立省两个端口

前言 此方法适用于Pod不需要大量连接的情况: 有多个pod在执行任务, 偶尔需要连接其中一个pod查看进度/日志;对pod执行一个脚本/命令; 不适用于大量连接建立的情况: pod启的数据库服务;pod启的Api服务;pod启的前端服务;pod启的Oss服务; Portforward简介 Portforward就是端…

MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合

2024小结&#xff1a;在写作分享上&#xff0c;这里特别感谢CSDN社区提供平台&#xff0c;支持大家持续学习分享交流&#xff0c;共同进步。社区诚意满满的干货&#xff0c;让大家收获满满。 对我而言&#xff0c;珍惜每一篇投稿分享&#xff0c;每一篇内容字数大概6000字左右&…

【微服务】面试 7、幂等性

幂等性概念及场景 概念&#xff1a;多次调用方法或接口不改变业务状态&#xff0c;重复调用结果与单次调用一致。例如在京东下单&#xff0c;多次点击提交订单只能成功一次。场景&#xff1a;包括用户重复点击、网络波动导致多次请求、mq 消息重复消费、代码中设置失败或超时重…

漏洞扫描工具

完整源码项目包获取→点击文章末尾名片&#xff01; 漏洞检测 该模块主要是对目标Web系统进行安全漏洞扫描&#xff0c;包括SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;、弱密码、中间件漏洞。中间件漏洞扫描包括对Weblogic、Struts2、Tomcat 、Jboss、Drupal、Nexus的已…

Mysql--基础篇--多表查询(JOIN,笛卡尔积)

在MySQL中&#xff0c;多表查询&#xff08;也称为联表查询或JOIN操作&#xff09;是数据库操作中非常常见的需求。通过多表查询&#xff0c;你可以从多个表中获取相关数据&#xff0c;并根据一定的条件将它们组合在一起。MySQL支持多种类型的JOIN操作&#xff0c;每种JOIN都有…

【数据结构】第1天之Java中的数据结构

前言 众所周知&#xff0c;程序数据结构算法&#xff0c;可见数据结构的重要性。 在Java中&#xff0c;数据结构通常指的是Java集合框架中的类和接口。 Java集合框架提供了一套标准的数据结构&#xff0c;例如列表、集合、映射表等&#xff0c;以及相应的实现类。 今天要分享的…

js代理模式

允许在不改变原始对象的情况下&#xff0c;通过代理对象来访问原始对象。代理对象可以在访问原始对象之前或之后&#xff0c;添加一些额外的逻辑或功能。 科学上网过程 一般情况下,在访问国外的网站,会显示无法访问 因为在dns解析过程,这些ip被禁止解析,所以显示无法访问 引…

docker-compose方式部署单机版RocketMQ

1、准备工作目录和配置文件 rocketmq\_ conf/broker.conf\_ docker-compose.yml在 rocketmq/conf/ 目录下面&#xff0c;创建broker.conf文件&#xff1a; # Broker所属的集群名称&#xff0c;默认是DefaultCluster brokerClusterNameDefaultCluster# Broker的名称 brokerNam…

有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗

近期&#xff0c;有多名开发者反馈&#xff0c;收到来自腾讯科技 (深圳) 有限公司委托北京的一家**诚律师事务所卞&#xff0c;写给AppStore的投诉邮件。 邮件内容主要说的是&#xff0c;腾讯注册了【水印相机】这四个字的商标&#xff0c;所以你们这些在AppStore上的app&…

爬虫基础之爬取歌曲宝歌曲批量下载

声明&#xff1a;本案列仅供学习交流使用 任何用于非法用途均与本作者无关 需求分析: 网站:邓紫棋-mp3在线免费下载-歌曲宝-找歌就用歌曲宝-MP3音乐高品质在线免费下载 (gequbao.com) 爬取 歌曲名 歌曲 实现歌手名称下载所有歌曲 本案列所使用的模块 requests (发送…

Java 如何传参xml调用接口获取数据

传参和返参的效果图如下&#xff1a; 传参&#xff1a; 返参&#xff1a; 代码实现&#xff1a; 1、最外层类 /*** 外层DATA类*/ XmlRootElement(name "DATA") public class PointsXmlData {private int rltFlag;private int failType;private String failMemo;p…

java项目之在线文档管理系统源码(springboot+mysql+vue+文档)

大家好我是风歌&#xff0c;曾担任某大厂java架构师&#xff0c;如今专注java毕设领域。今天要和大家聊的是一款基于springboot的在线文档管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 在线文档管理系统的主要使用者分为管…

学技术步骤,(tomcat举例)jar包api手写tomcat静态资源基础服务器

1.看有哪些包&#xff0c;能用本地离线的包就使用离线包 2.尽量不要使用配置文件&#xff08;先不用&#xff09;&#xff0c;能用api就用api&#xff0c; 因为配置文件只是文本&#xff0c;其实要的只是配置文件里的参数&#xff0c; 这些参数最后肯定还是要给到这些api去处…

React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode

【2024最新版】React18 核心源码分析教程&#xff08;全61集&#xff09; Element对象与Fiber对象 在 React 中&#xff0c;Element 对象 和 Fiber 对象 是核心概念&#xff0c;用于实现 React 的高效渲染和更新机制。以下是它们的详细解读&#xff1a; 1. Element 对象 定…

如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦

一、问题背景 自OceanBase 4.3.0版本起&#xff0c;支持了列存引擎&#xff0c;允许表和索引以行存、纯列存或行列冗余的形式创建&#xff0c;且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外&#xff0c;也有用户询问如何通过SQL语句…

超完整Docker学习记录,Docker常用命令详解

前言 关于国内拉取不到docker镜像的问题&#xff0c;可以利用Github Action将需要的镜像转存到阿里云私有仓库&#xff0c;然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址&#xff1a;使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…

数据结构-排序课后题

今天我们来简单的说说关于排序的一些课后练习题. 对应的知识点博客: LINK. 目录 1. 每一单趟都能确定一个数字的最终位置的排序2. 根据序列变化确定排序方式3. 排序顺序对哪些排序效率影响不大?4. 对有序序列排序最费力的排序方式是什么?5. 对接近有序序列排序最快的排序方式…