【LeetCode】704.二分查找

news2025/1/18 4:48:58

704.二分查找

在这里插入图片描述

解析:

思路一:暴力解法,直接遍历,从头开始查找,如果找到直接返回下标,找不到返回-1。

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

思路二:二分查找;

使用二分查找的前提条件是:

1.数组为有序数组;

2.数组中无重复元素(一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的)。

二分查找中,最容易搞混的两点为:

1.while循环里面的条件应该是while(left < right)还是while(left <= right)

2.right再次赋值的时候应该是right = middle还是right = middle - 1

二分查找分析:

首先我们要对区间的定义进行明确,即确定这个区间是左闭右闭([left,right],区间包含leftright)还是左闭右开([left,right),区间包含left,但是不包含right),一般情况下都是这两种情况;然后针对不同区间的定义,进行边界条件的处理(即while循环条件)。

对于区间的定义不一样,是直接影响边界条件的处理的(即while循环条件)。

第一种情况:左闭右闭

当我们使用左闭右闭区间的时候,while(left <= right)是合法的,即leftright能够满足这个条件;

right再次赋值时我们已经判断middle不等于target了,要控制好边界条件,所以要让right = middle-1;当我们写成right = middle时,区间不明确,边界处理的不对,会出问题;left再次赋值时,也不能等于middle,更新右区间里的左边界。
在这里插入图片描述

左闭右闭代码如下:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int right = nums.size() - 1; //左闭右闭要包含right,所以right = nums.size() - 1
        int left = 0;
        while(left <= right) //合法情况
        {
            int middle = (left + right) / 2;
            if(nums[middle] > target)
                right = middle - 1;//更新左区间里的右边界
            else if(nums[middle] < target)
                left = middle + 1;//更新右区间里的左边界
            else
                return middle;
        }
        return -1;
    }
};

第二种情况:左闭右开

左闭右开区间,left不能和right相等,所以循环条件应该是while(left < right),根据区间的定义来查询,因为右开不包含right,所以right = middle,更新左区间里的右边界,left更新的时候仍然是left = middle + 1
在这里插入图片描述

左闭右开代码如下:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int right = nums.size();//左闭右开不包含right,所以right = nums.size()
        int left = 0;
        while(left < right) //不能加等于
        {
            int middle = (left + right) / 2;
            if(nums[middle] > target)
                right = middle;//更新左区间里的右边界
            else if(nums[middle] < target)
                left = middle + 1;//更新右区间里的左边界
            else
                return middle;
        }
        return -1;
    }
};

总结:

左闭右闭区间时,while的循环条件为left <= right,且right = middle -1

左闭右开区间时,while的循环条件为left < right,且right = middle

两个区间的left都是left = middle + 1

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

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

相关文章

[架构之路-192]-《软考-系统分析师》-8-软件工程 - 14种UML图快速概览

目录 第1章 UML概述 1.1 什么是UML&#xff1f; 1.2 为什么要用UML&#xff1f; 1.3 UML图有哪些&#xff1f; 1.4 UML图概览 第2章 UML图示 2.1 静态图、结构图 - 什么是类图&#xff1f; 泛化&#xff08;Generalization&#xff09; 实现&#xff08;Realization&a…

四:redis的常见命令及5种基本数据类型

四:redis的常见命令及数据类型 Redis 键(key) 命令1.String&#xff08;字符串&#xff09;2.List(列表类型)3.set(集合)4.Hash(哈希)5.Zset(有序集合) redis官网可查看所有命令&#xff1a; https://www.redis.net.cn/order/ Redis 键(key) 命令 127.0.0.1:6379> keys * …

String、StringBufer、StringBuild类

文章目录 1. String1.1 String的特性1.2 String的不可变的特性理解1.3 String不同实例化方式的对比1.4 *String中的常用方法1.5 String与其他类型之间的转换1.5.1 String与基本数据类型、包装类之间的转换1.5.2 String与字符数组(char[])之间的转换 2. StringBuffer类2.1 Strin…

如何从菜鸟变成大佬:提升写文案的技巧

其实很多人都不知道文案是什么&#xff1f; 他们分不清文案和日常的写作之间的区别。 其实&#xff0c;文案和日常的写作的最大区别就是是否能够产生销售力。 比如你平时写作文、写博客、写情感文章、写政府报告&#xff0c;公文、写书之类的&#xff0c;都不属于文案的范畴…

基于线上考研资讯数据抓取的推荐系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网的飞速发展&#xff0c;互联网在各行各业的应用迅速成为众多学校关注的焦点。他们利用互联网提供电子商务服务&#xff0c;然后有了“考研信息平台”&#xff0c;这将使学生考研的信息平台更加方便和简单。 对于考研信息平台的设计&#xff0c;大多采用java技…

Ae:绘画面板

Ae菜单&#xff1a;窗口/绘画 Paint 快捷键&#xff1a;Ctrl 8 绘画工具&#xff08;画笔工具、仿制图章工具及橡皮擦工具&#xff09;仅能工作在图层面板上。在使用绘画工具之前&#xff0c;建议先在绘画 Paint面板中查看或进行相关设置。 说明&#xff1a; 如果要在绘画描边…

尝试通过俄罗斯方块解释程序员这个职业

每到毕业季和高考季&#xff0c;总会有相关的职业前景咨询环节等待着我&#xff0c;不管我愿不愿意~~。 每次我都会变着法向众人解释程序员这个职业&#xff0c;声泪俱下地描述互联网各种血泪史&#xff0c;先去考公不要进坑云云。可是效果非常不好&#xff0c;7、8月份这群人…

使用docker compose 安装最新版neo4j

一、Neo4j和图数据库简介 neo4j是基于Java语言编写图形数据库。图是一组节点和连接这些节点的关系。图形数据库也被称为图形数据库管理系统或GDBMS。 Neo4j的是一种流行的图形数据库。 其他的图形数据库是Oracle NoSQL数据库&#xff0c;OrientDB&#xff0c;HypherGraphDB&am…

AIGC周报|下一个裁谁?老板:问问AI;OpenAI推出Shap·E;库克:AI仍有不少问题要解决

AIGC&#xff08;AI Generated Content&#xff09;即人工智能生成内容。近期爆火的 AI 聊天机器人 ChatGPT&#xff0c;以及 DallE 2、Stable Diffusion 等文生图模型&#xff0c;都属于 AIGC 的典型案例&#xff0c;它们通过借鉴现有的、人类创造的内容来快速完成内容创作。 …

网络基础之应用层协议,组织方式,自定义协议和http协议https协议简单介绍

网络基础之应用层协议 应用层介绍应用层是什么 组织方式序列化反序列化常见的自定义序列化方式 HTTP协议——超文本传输协议&#xff08;最早就是用来传输web网页传输的&#xff09;HTTP协议的特性HTTP协议的格式&#xff1a; HTTP 请求请求行HTTP常见HeaderHTTP常见状态码 HTT…

asp.net+C#公交线路换乘查询系统

系统功能结构图 (1)用户查询模块 在用户查询模块中&#xff0c;主要是查询出用户自己所需要的线路信息&#xff0c;这也是整个系统最主要的功能模块。主要包括&#xff1a; ①查询车次信息&#xff1a;输入要查询的车次进行搜索&#xff0c;可以查询出于它相应的站点名和站点描…

unity航点寻径

一、游戏框架&#xff1a;设置了六个路标&#xff0c;角色会在这六个路标之间一次移动&#xff0c;当移动到第六个路标后又会返回第一个路标&#xff0c;继续依次移动。 road&#xff1a; 道路&#xff0c;由五个立方体组成 sign&#xff1a;路标&#xff0c;由六个胶囊组成 …

系统集成项目管理工程师 下午 真题 及考点(2020年下半年)

文章目录 2020年下半年试题一&#xff1a;第10章 项目质量管理&#xff0c;规划质量管理过程的输入试题二&#xff1a;第9章 项目成本管理&#xff0c;典型&#xff1a;EAC ACETC AC&#xff08;BAC-EV&#xff09;/CPI BAC/CPI试题三&#xff1a;第18章 项目风险管理&#x…

Grafana 系列-统一展示-3-Prometheus 仪表板

系列文章 Grafana 系列文章 知识储备 Prometheus Template Variables 你可以使用变量来代替硬编码的细节&#xff0c;如 server、app 和 pod_name 在 metric 查询中。Grafana 在仪表盘顶部的下拉选择框中列出这些变量&#xff0c;帮助你改变仪表盘中显示的数据。Grafana 将…

【Java EE】-Servlet(四) Cookie和Session

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 寂寞会发慌&#xff0c;孤独是饱满的。——史铁生《命若琴弦》 主要内容&#xff1a;Cookie的理解&#xff0c;Cookie是什么&#xff1f;Cookie从哪里来&#x…

【消息中间件】kafka高性能设计之内存池

文章目录 前言实现创建内存池分配内存释放内存 总结 前言 Kafka的内存池是一个用于管理内存分配的缓存区域。它通过在内存上保留一块固定大小的内存池&#xff0c;用于分配消息缓存、批处理缓存等对象&#xff0c;以减少频繁调用内存分配函数的开销。 Kafka内存池的实现利用了…

怎么在本地运行umi框架的生产模式

怎么在本地运行umi框架的生产模式 第一种 先使用build进行编译构建, 在webstorm软件上可以在package.json文件上点击运行;或者直接在命令行上敲max build进行构建, 构建好后就会多个dist目录&#xff0c;里面就是编译好的静态文件。 然后在package.json中添加 "serve&qu…

UDP通信机制详解

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Helm常用命令记录

问: 到哪里去搜索helm package? 答: artifacthub.io helm versionhelm repo add bitnami https://charts.bitnami.com/bitnamihelm install my-release bitnmai/mysqlkubectl get po --all-namespaceshelm uninstall my-release 安装monitoring,推荐kube-prometheus-stack&am…

【SWAT水文模型】SWAT水文模型建立及应用第三期:基于世界土壤数据库HWSD建立土壤库

SWAT水文模型建立及应用&#xff1a;土壤库建立 1 简介2 土壤数据下载2.1 数据下载方式2.1.1 世界土壤数据库HWSD数据2.1.2 中国土壤数据库 2.2 数据下载 3 土壤数据的准备3.1 SWAT土壤数据库参数3.2 提取HWSD中土壤参数3.3 土壤类型分布图的处理3.4 土壤质地转化3.5 土壤参数的…