算法每日双题精讲 —— 二分查找(二分查找,在排序数组中查找元素的第一个和最后一个位置)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 

别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪 


      在算法的浩瀚星空中✨,二分查找算法宛如一颗璀璨的明星🌟,闪耀着简洁与高效的光芒。今天,就让我们一同聚焦于 “二分查找” 以及 “在排序数组中查找元素的第一个和最后一个位置” 这两道经典题目,深度挖掘二分查找算法的奥秘与应用技巧🤓。

不要跳过每一个二分查找算法文章哦,难度逐渐提升 !


目录

 二分查找简介

一、二分查找

📖题目描述

🧠讲解算法原理

💻代码实现(以 C++ 为例)

 复杂度分析

二、在排序数组中查找元素的第一个和最后一个位置

📖题目描述

🧠讲解算法原理

💻代码实现(以 C++ 为例)

复杂度分析


二分查找简介

特点:最恶心,细节最多,最容易写出死循环,但是掌握就是最简单的算法

二分查找有三个模板:

  1. 朴素的二分模板——easy,局限
  2. 查找左边界的二分模板——万能,细节多
  3. 查找右边界的二分模板


一、二分查找

题目链接👉【力扣】

📖题目描述

 

🧠讲解算法原理

        二分查找的核心思想犹如在一本有序的字典中查找单词📕,每次都能通过中间元素将搜索区间大致缩小一半。"二段性"
        首先,我们设定两个指针,left 指向数组的起始位置,right 指向数组的末尾位置。然后,在循环中计算中间索引 mid = left + (right - left) / 2(这种计算方式可有效避免整数溢出)。接下来,比较 nums[mid] 与 target 的大小关系:

  • 若 nums[mid] == target,则幸运地找到了目标值,直接返回 mid 😀。
  • 若 nums[mid] < target,这表明目标值在中间元素的右侧,于是将 left 更新为 mid + 1,继续在右侧区间查找。
  • 若 nums[mid] > target,意味着目标值在中间元素的左侧,此时将 right 更新为 mid - 1,继续在左侧区间探索。
    循环持续进行,直到 left 大于 right,表示整个数组都已搜索完毕但未找到目标值,此时返回 -1。

💻代码实现(以 C++ 为例)

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

 复杂度分析

        时间复杂度:由于每次循环都能将搜索区间缩小一半,最多需要进行 log_2 n 次比较,所以时间复杂度为 O(log n) ,其中 n 为数组的长度。这使得二分查找在处理大规模有序数据时表现极为出色,相比暴力遍历数组的  O(n) 时间复杂度,效率有了质的飞跃🚀!
空间复杂度:整个查找过程只需要使用几个额外的指针变量来记录索引和中间位置,无需额外的数据结构来存储数据,所以空间复杂度为 O(1) ,具有极高的空间效率👍!


二、在排序数组中查找元素的第一个和最后一个位置

题目链接👉【力扣】

📖题目描述

🧠讲解算法原理

        首先,借二分查找思想找到目标值任一位置😃。找首位置时,从该位置向左搜,遇到首个不等元素,其下一位即目标首位置🧐;找尾位置同理,从找到处向右搜,遇到首个不等元素,其前一位即目标尾位置。

        为避免代码重复,编写辅助函数实现二分查找核心逻辑,主函数调用它分别找目标值首尾位置😎。

💻代码实现(以 C++ 为例)

#include <vector>
using namespace std;class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {// 如果数组为空,直接返回{-1, -1},表示未找到目标值的起始和结束位置if(nums.size()==0) return {-1,-1}; vector<int> x;int left = 0, right = nums.size() - 1;int mid = 0;// 查找目标值的左边界while(left < right) {// 计算中间位置,防止(left + right)溢出mid = left+(right - left)/2; if(nums[mid] >= target) {// 如果中间值大于等于目标值,说明目标值的左边界可能在左半部分(包括mid)right = mid; }if(nums[mid] < target) {// 如果中间值小于目标值,说明目标值的左边界在右半部分left = mid + 1; }}// 检查找到的left位置是否为目标值if(nums[left] == target)    x.push_back(left);elsex.push_back(-1);// 重置left和right,准备查找目标值的右边界left = 0; right = nums.size() - 1; // 查找目标值的右边界while(left < right) {// 这里加1是为了保证在left和right相差1时,mid能取到right,避免死循环mid = left+(right - left + 1)/2; if(nums[mid] > target) {// 如果中间值大于目标值,说明目标值的右边界在左半部分right = mid - 1; }if(nums[mid] <= target) {// 如果中间值小于等于目标值,说明目标值的右边界可能在右半部分(包括mid)left = mid; }}// 检查找到的left位置是否为目标值if(nums[left] == target)    x.push_back(left);elsex.push_back(-1);return x;}
};

复杂度分析

        时间复杂度:整体时间复杂度仍为 O(log n),因为主要操作还是基于二分查找,虽然需要分别查找目标值的第一个和最后一个位置,但每次查找的时间复杂度依然是对数级别的。
        空间复杂度:同样,由于只使用了少量额外的变量来辅助查找,空间复杂度为 O(1),在空间利用上保持了高效性。


         通过对这两道题目的详细解析,我们深刻领略了二分查找算法在处理数组查找问题时的强大威力💪!它以其简洁的逻辑和高效的性能,成为算法领域中不可或缺的重要工具。希望大家在今后的算法学习过程中,能够熟练掌握并灵活运用二分查找算法,轻松应对各种类似的挑战。


 我将持续在算法领域精研深耕,为大家带来更多优质的算法知识讲解与问题剖析。

欢迎大家关注我 👉【A charmer】

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

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

相关文章

《C++11》深入剖析正则表达式库:解锁文本处理的高效之道

在现代编程领域&#xff0c;文本处理是一项不可或缺的任务&#xff0c;而正则表达式无疑是这一领域的强大利器。C11标准库的引入&#xff0c;为C开发者带来了正则表达式库&#xff0c;极大地丰富了C在文本处理方面的能力。本文将全方位、多角度地深入探讨C11正则表达式库&#…

Cosmos:英伟达发布世界基础模型,为机器人及自动驾驶开发加速!

1. 简介 在2025年消费电子展&#xff08;CES&#xff09;上&#xff0c;NVIDIA发布了全新的Cosmos平台&#xff0c;旨在加速物理人工智能&#xff08;AI&#xff09;系统的开发&#xff0c;尤其是自主驾驶车辆和机器人。该平台集成了生成式世界基础模型&#xff08;WFM&#x…

Hive集群的安装准备

Hive的安装与集群部署详细指南 一、环境与软件准备 在开始Hive的安装与集群部署之前&#xff0c;确保您准备好以下环境和软件&#xff1a; 虚拟机软件&#xff1a; VMware Workstation 17.5&#xff1a;用于创建和管理虚拟机&#xff0c;确保可以在其上安装Linux操作系统。 …

SpringBoot集成Mongodb

SpringBoot集成Mongodb 本文简要介绍SpringBoot集成mongodb&#xff0c;并实现增删改查 1. 引入依赖 spring-boot-starter-data-mongodb 提供了mongoTemplate供底层操作及mongodb驱动等 <dependency><groupId>org.springframework.boot</groupId><arti…

java根据模板导出word,并在word中插入echarts相关统计图片以及表格

引入依赖创建word模板创建ftl模板文件保存的ftl可能会出现占位符分割的问题&#xff0c;需要处理将ftl文件中的图片的Base64删除&#xff0c;并使用占位符代替插入表格&#xff0c;并指定表格的位置在图片下方 Echarts转图片根据模板生成word文档DocUtil导出word文档 生成的wor…

RabbitMQ的工作模式

&#xff08;一&#xff09;工作模式 RabbitMQ有7种工作模式来进行消息传递&#xff0c;我们上一篇博客就是简单模式 1.简单模式&#xff08;simple&#xff09; 也就是点对点的形式 P就是生产者&#xff0c;C就是消费者&#xff0c;Queue就是消息队列&#xff08;生产者向qu…

晨辉面试抽签和评分管理系统之十:如何搭建自己的数据库服务器,使用本软件的网络版

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-新增 topeet子系统-编写 bundle.json文件

bundle.json 文件内容如下所示&#xff1a; 下面是对各个字段的解释&#xff1a; 1. name: "ohos/demos" - 这是组件或项目的名称&#xff0c;这里表示它属于 OHOS&#xff08;OpenHarmony OS&#xff09;生态系统下的一个名为"demos"的组件。 2. descri…

JavaScript-正则表达式方法(RegExp)

RegExp 对象用于将文本与一个模式匹配。 有两种方法可以创建一个 RegExp 对象&#xff1a;一种是字面量&#xff0c;另一种是构造函数。 字面量由斜杠 (/) 包围而不是引号包围。 构造函数的字符串参数由引号而不是斜杠包围。 new RegExp(pattern[, flags])一.符集合 1.选择…

信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高

《港湾商业观察》施子夫 1月8日&#xff0c;深交所官网显示&#xff0c;浙江信凯科技集团股份有限公司&#xff08;以下简称“信凯科技”&#xff09;主板IPO提交注册。 自2022年递交上市申请&#xff0c;信凯科技的IPO之路已走过两年光景&#xff0c;尽管提交注册&#xff0…

Windows远程桌面网关出现重大漏洞

微软披露了其Windows远程桌面网关&#xff08;RD Gateway&#xff09;中的一个重大漏洞&#xff0c;该漏洞可能允许攻击者利用竞争条件&#xff0c;导致拒绝服务&#xff08;DoS&#xff09;攻击。该漏洞被标识为CVE-2025-21225&#xff0c;已在2025年1月的补丁星期二更新中得到…

4G DTU赋能智能配电环网柜通信运维管理

在智能电网建设持续推进下&#xff0c;智能配电环网柜作为配电网的关键节点设备&#xff0c;其稳定、高效运行对保障电力可靠供应是品质生活的基本保障。通信系统是实现智能配电环网柜远程监控与管理的核心纽带&#xff0c;而4G DTU&#xff08;数据传输单元&#xff09;凭借其…

STC的51单片机LED点灯基于KEIL

前言&#xff1a; 该文源于回答一个朋友的问题&#xff0c;代码为该朋友上传&#xff0c;略作修改&#xff0c;在此说明问题以及解决问题的思路&#xff0c;以减少新手错误。 电路图&#xff1a; 该位朋友未上传电路图&#xff0c;说明如下&#xff1a; stc8g1k08a-sop8控制…

C++ 文字识别OCR

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

基于springboot的自习室预订系统

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG

注&#xff1a;本文为“TCP 连接状态标识”相关文章合辑。 TCP 的状态&#xff1a;SYN, FIN, ACK, PSH, RST, URG 简介及 ACK 确认机制 llzhang_fly 于 2020-09-19 05:25:26 发布 1、TCP 的状态 FLAGS 字段状态 在 TCP 层&#xff0c;有个 FLAGS 字段&#xff0c;这个字段有…

Spring AI 从入门到实践

​Spring AI 从入门到实践 1.什么是Spring AI 2.使用Spring Boot&Spring AI快速构建AI应用程序 3.ChatClient&Chat Model简化与AI模型的交互 4.Spring AI Prompt:与大模型进行有效沟通 5.结构化输出大模型响应 6.实战:AI聊天机器人 Ben技术站关注Java技术&#x…

1月13日学习

[HITCON 2017]SSRFme 直接给了源代码&#xff0c;题目名称还是ssrf&#xff0c;那么该题大概率就是SSRF的漏洞&#xff0c;进行代码审计。 <?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头&#xff0c;如果存在&#xff0c;则将其拆分为数组&#xff0c;并将第一个 IP 地址…

【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍

从帝国理工的PPT学习。 什么是RDMA Remote Direct Memory Access&#xff0c;也就是Remote的DMA&#xff0c;是一种硬件机制&#xff0c;能直接访问远端结点的内存&#xff0c;而不需要处理器介入。 其中&#xff1a; Remote&#xff1a;跨node进行数据传输Direct&#xff…

Docker

1. 初始Docker 1.1. 什么是Docker&#xff1f; 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环…