当前位置: 首页 > news >正文

【二分查找】

二分查找

  • 704. 二分查找
  • 35. 搜索插入位置
  • 34. 在排序数组中查找元素的第一个和最后一个位置
  • 结语

704. 二分查找

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

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

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

链接: 二分查找

这个题是一个最基础的二分查找题目,需要你写出二分查找最基础的模板出来。
二分查找有许多的边界问题,每一次边界的处理都要坚持根据区间的定义来操作
,这就是循环不变量规则。

由题可知,该数组是一个升序的有序整型数组,
在这里插入图片描述
定义一个l变量,一个r变量,一个mid,分别表示的左值,右值,中值。
然后对每一次的mid中值进行一次check,当循环正常结束就是没有target值,
返回-1.

代码:

int search(int* nums, int numsSize, int target){int left=0,right=numsSize-1;int mid=(left+right)/2;while(left<right){if(nums[mid]>=target){right=mid;}else left=mid+1;mid=(left+right)/2;}if(nums[left]==target)return left;return -1;}

35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

输入: nums = [1,3,5,6], target = 5
输出: 2

输入: nums = [1,3,5,6], target = 2
输出: 1

输入: nums = [1,3,5,6], target = 7
输出: 4

链接: 搜索插入位置

这道题是二分查找的稍微进阶,相较于上一题需要考虑边界情况,
以及最后的返回值。

将上一题的代码拷贝下来


while(left<=right)
{if(nums[mid]==target){return mid;}if(nums[mid]>target){right=mid-1;}if(nums[mid]<target){left=mid+1;}mid=(left+right)/2;

这是部分代码,从题中可知,
如果在遍历的时候找到与target对应的值,那么可以直接返回此时的下标mid
如果没有找到的话,循环结束后l,r,mid,这三个下标哪个是正确的返回值呢。

由题意得,返回的是按照值大小顺序插入的位置,所以返回了l的下标。

代码:

int searchInsert(int* nums, int numsSize, int target){int right =numsSize-1;int left=0;int mid=(right+left)/2;while(left<=right){if(nums[mid]==target){return mid;}if(nums[mid]>target){right=mid-1;}if(nums[mid]<target){left=mid+1;}mid=(left+right)/2;}return left;}

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

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

链接: 在排序数组中查找元素的第一个和最后一个位置

解题思路:
1.题目要求找出等于target大小的数组元素下标的开始位置和结束位置。
2.也就说需要进行两次二分查找,一次找出开始位置,一次找出结束位置
3.找出开始位置:

  1. 当数组中有target元素的时候,我们可以将其分为两个部分
  2. 第一个部分范围为所有 小于target的值
  3. 第二部分则为所有 大于等于target的值
  4. 由此可知,第二部分的开头位置的下标即为所求

代码:

        int l = 0;int r = nums.size() - 1;int mid = (l + r) / 2;while (l < r){if (nums[mid] >= target){r = mid;}else{l = mid + 1;}mid = (l + r) / 2;}

4.找出结束位置下标:(同上)

  1. 当数组中有target元素的时候,我们可以将其分为两个部分
  2. 第一个部分范围为所有 小于等于target的值
  3. 第二部分则为所有 大于target的值
  4. 由此可知,第一部分的结束位置的下标即为所求

注意: 此时随着循环更新的是l的值,所以更新方式应改变。mid=(l+r+1)/2
代码:

l = 0;
r = nums.size() - 1;
mid = (l + r+ 1) / 2;
while (l < r)
{if (nums[mid] <= target){l = mid;}else{r = mid - 1;}mid = (r + l+ 1) / 2;
}

每次求出也要检查所求下标对应的值是否为target。

代码:

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> ans;//特殊情况处理if(nums.size()==0){ans.push_back(-1);ans.push_back(-1);return ans;}//初始位置int l = 0;int r = nums.size() - 1;int mid = (l + r) / 2;while (l < r){if (nums[mid] >= target){r = mid;}else{l = mid + 1;}mid = (l + r) / 2;}if (nums[l] == target) ans.push_back(l);else ans.push_back(-1);//结束位置l = 0;r = nums.size() - 1;mid = (l + r+ 1) / 2;while (l < r){if (nums[mid] <= target){l = mid;}else{r = mid - 1;}mid = (r + l+ 1) / 2;}if (nums[r] == target) ans.push_back(r);else ans.push_back(-1);return ans;}
};

结语

本期的二分查找到此结束,希望对各位有所帮助

我是Tom-猫
如果觉得有帮助的话,记得
一键三连哦ヾ(≧▽≦*)o。
在这里插入图片描述

相关文章:

【二分查找】

二分查找704. 二分查找35. 搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位置结语704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在…...

Vue学习 -- 如何用Axios发送请求(get post)Promise对象 跨域请求问题

什么是Axios Vue本身是不支持发送axios请求&#xff0c;需要使用第三方插件&#xff0c;这里推荐使用Axios&#xff0c;Axios是基于promise的HTTP库&#xff1b;它会从浏览器中创建XMLHttpRequset对象。 安装Axios npm install axios -S下载后把axios.js文件复制进项目目录 …...

TVS和稳压管的相同点和不同点

大家好,我是记得诚。 文章目录 介绍相同点不同点介绍 TVS和稳压管都是电路中很常用的电子元器件,都是二极管的一个种类。 TVS二极管全称是Transient voltage suppression diode,也叫瞬态电压抑制二极管。 稳压二极管英文名字Zener diode,又叫齐纳二极管。 关于稳压二极…...

微信小程序项目实例——扫雷

今日推荐&#x1f481;‍♂️ 2023许嵩演唱会即将到来&#x1f3a4;&#x1f3a4;&#x1f3a4;大家一起冲冲冲&#x1f3c3;‍♂️&#x1f3c3;‍♂️&#x1f3c3;‍♂️ &#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;往期优质项目实例&#x1f52e…...

2022-2023年度广东省职业院校学生专业技能大赛 中职组网络安全赛项竞赛规程

2022-2023年度广东省职业院校学生专业技能大赛 中职组网络安全赛项竞赛规程 一、赛项名称 赛项编号&#xff1a;Z27 赛项名称&#xff1a;网络安全赛项组别&#xff1a;中职 赛项归属&#xff1a;信息技术类 二、竞赛目的 为检验中职学校网络信息安全人才培养成效&#xff0c;促…...

超详细的堆排序,进来看看吧。

1.堆的基本概念1.1什么是堆堆是一种叫做完全二叉树的数据结构&#xff0c;1.2大堆和小堆大堆:每个节点的值都大于或者等于他的左右孩子节点的值小根堆:每个结点的值都小于或等于其左孩子和右孩子结点的值1.3完全二叉树节点之间的关系leftchild parent*2 1rightchild parent*…...

线性回归 特征扩展的原理与python代码的实现

文章目录1 多项式扩展的作用2 多项式扩展的函数2.1 接收参数2.2 多项式扩展示例3 多项式扩展的完整实例1 多项式扩展的作用 在线性回归中&#xff0c;多项式扩展是种比较常见的技术&#xff0c;可以通过增加特征的数量和多项式项的次数来提高模型的拟合能力。 举个例子&#…...

订阅关系一致

订阅关系一致指的是同一个消费者Group ID下所有Consumer实例所订阅的Topic、Tag必须完全一致。如果订阅关系不一致,消息消费的逻辑就会混乱,甚至导致消息丢失。本文提供订阅关系一致的正确示例代码以及订阅关系不一致的可能原因,帮助您顺畅地订阅消息。 背景信息 消息队列Ro…...

测试老鸟都在用的接口抓包常用工具以及接口测试工具都有哪些?

目录 接口 接口测试的重要性 常用抓包工具 常用接口测试工具 接口 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间…...

Delphi 一个函数实现腾讯云最新版(API3.0)短信发送

目录 一、腾讯云短信基本知识 1. 需要在腾讯云后台注册账号 2. 需要在腾讯云中开通短信功能 3. 腾讯云短信版本说明 4. 短信内容的组成 特定规范 二、短信发送函数 三、下载源代码(收费) 一、腾讯云短信基本知识 如今我们随时都收到短信验证码&#xff0c;注册码等等。这是…...

2023年Android现代开发

2023年现代Android开发 下面与大家分享如何构建具有2023年最新趋势的Android应用程序。 Android是什么&#xff1f; Android 是一种基于 Linux 内核并由 Google 开发的开源操作系统。它用于各种设备&#xff0c;包括智能手机、平板电脑、电视和智能手表。 目前&#xff0c…...

自然语言处理(NLP)在医疗领域的应用

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。在各个领域都有其应用。 其在生物医学领域迅速发展&#xff0c;已经…...

计算机中的浮点数运算

计算机中的浮点数 计算机中以固定长度存储浮点数的方式&#xff0c;造成了浮点数运算过程容易产生上溢和下溢。以float32为例, 其标记位占1bit,指数位占8bit,小数部分占23bit 经典下溢场景 不满足精度导致截断误差 #include <iostream> #include <iomanip> usin…...

看了字节跳动月薪20K+测试岗面试题,让我这个工作3年的测试工程师,冷汗直流....

朋友入职已经两周了&#xff0c;整体工作环境还是非常满意的&#xff01;所以这次特意抽空给我写出了这份面试题&#xff0c;而我把它分享给伙伴们&#xff0c;面试&入职的经验&#xff01; 大概是在2月中的时候他告诉我投递了字节跳动并且简历已通过&#xff0c;2月23经过…...

这两天最好的ChatGPT应用;使用Notion AI提升效率的经验(13);AI编程与程序员的生存 | ShowMeAI日报

&#x1f440;日报合辑 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 硅谷银行风波中&#xff0c;OpenAI 创始人大方帮助硅谷初创公司&#xff1a;钱先拿着用&#xff0c;有了再还 OpenAI 创始人 Sam Altman 的弟弟…...

Linux 内核likely与unlikey

内核源码的时候经常可以看到likely()和unlikely()函数&#xff0c;这两个函数的作用是什么&#xff1f;-- 先得学一学GCC提供的内建函数&#xff01;&#xff01; likely和unlikely内核中的定义 # define likely(x) __builtin_expect(!!(x), 1) # define unlikely(x) __built…...

成功解决主从同步异常之Slave_IO_Running显示为No的问题

前言 MySQL主从同步在做的过程中很容易出问题, 尤其是双主配置,参数多,需要在两台服务器中反复操作,容易搞错导致失败,这里汇总的是主从同步异常之Slave_IO_Running显示为No的解决方案。 文章目录 前言一. 问题重现二. 排查过程2.1 查看UUID是否相同,并修改2.2 修改完UU…...

面试阿里测开岗失败后,被面试官在朋友圈吐槽了......

前一阵子有个徒弟向我诉苦&#xff0c;说自己在参加某大厂测试面试的时候被面试官怼得哑口无言&#xff0c;场面让他一度十分尴尬印象最深的就是下面几个问题&#xff1a;根据你以前的工作经验和学习到的测试技术&#xff0c;说说你对质量保证的理解&#xff1f;非关系型数据库…...

蓝桥杯嵌入式--字符串比较在串口通信中的应用

前言今天做了个模拟题&#xff0c;大致意思是接收上位机发的字符串&#xff0c;然后执行相应操作。思路很明确&#xff0c;就是把接收到的内容进行比较&#xff0c;但是从前我只学过比较数字的方式&#xff0c;即直接用“”进行比较&#xff0c;但是字符串不能使用这个方法&…...

考研408每周一题(2019 41)

2019年(单链表&#xff09; 41.(13分)设线性表L(a1,a2,a3,...,a(n-2),a(n-1),an)采用带头结点的单链表保存&#xff0c;链表中的结点定义如下&#xff1a; typedef struct node {int data;struct node *next; } NODE; 请设计一个空间复杂度为O(1)且时间上尽可能高效的算法&…...

Super IO:Blender文件操作效率革命,实现300%工作流提速

Super IO&#xff1a;Blender文件操作效率革命&#xff0c;实现300%工作流提速 【免费下载链接】super_io blender addon for copy paste import / export 项目地址: https://gitcode.com/gh_mirrors/su/super_io 在3D设计领域&#xff0c;文件导入导出的繁琐操作常常成…...

Pixel Language Portal 快速上手PyCharm:远程开发与模型调试配置详解

Pixel Language Portal 快速上手PyCharm&#xff1a;远程开发与模型调试配置详解 1. 为什么需要PyCharm远程开发 作为一名AI开发者&#xff0c;你可能经常遇到这样的困扰&#xff1a;本地电脑性能有限&#xff0c;跑不动大模型&#xff1b;服务器上开发又不够直观方便。PyCha…...

seo实用工具对网站长期发展有什么影响

SEO实用工具对网站长期发展的影响 在当今数字化时代&#xff0c;网站的长期发展离不开搜索引擎优化&#xff08;SEO&#xff09;。而SEO实用工具&#xff0c;则是推动网站长期发展的重要助手。它们不仅帮助提升网站的搜索排名&#xff0c;还能够提供数据分析、关键词研究和竞争…...

Pixel Language Portal效果展示:多轮对话上下文跨语种一致性保持

Pixel Language Portal效果展示&#xff1a;多轮对话上下文跨语种一致性保持 1. 产品概览 **像素语言跨维传送门(Pixel Language Portal)**是一款突破性的多语言交互工具&#xff0c;基于腾讯Hunyuan-MT-7B核心引擎构建。不同于传统翻译工具的机械感&#xff0c;它将语言转换…...

MongoDB(70)如何使用副本集进行备份?

使用副本集进行备份是一个常见的MongoDB备份策略&#xff0c;因为副本集提供了数据冗余和高可用性。通过从副本集中读取数据&#xff0c;可以在不影响主节点的情况下进行备份。以下是详细的步骤和示例代码&#xff0c;展示如何使用 MongoDB 副本集进行备份。方法一&#xff1a;…...

深度解析:基于摄像头的远程生理监测工具箱rPPG-Toolbox实战指南

深度解析&#xff1a;基于摄像头的远程生理监测工具箱rPPG-Toolbox实战指南 【免费下载链接】rPPG-Toolbox rPPG-Toolbox: Deep Remote PPG Toolbox (NeurIPS 2023) 项目地址: https://gitcode.com/gh_mirrors/rp/rPPG-Toolbox 远程生理监测技术正在医疗健康领域引发革命…...

别再手动查ID了!用R包一键搞定单细胞Marker基因ID转换(附org.Hs.eg.db实战)

单细胞Marker基因ID转换实战&#xff1a;用org.Hs.eg.db实现高效精准映射 刚完成单细胞聚类分析的研究者&#xff0c;常常会面临一个看似简单却极其耗时的任务——将Marker基因的Symbol标识转换为标准的Entrez ID。这个步骤虽然基础&#xff0c;却直接影响后续GO富集分析的可靠…...

Git开源贡献全指南:从入门到精通

开源项目Git贡献全流程拆解 理解开源项目贡献的基本概念 开源项目的定义与意义Git在开源协作中的核心作用常见的开源贡献类型&#xff08;代码、文档、测试等&#xff09; 准备开发环境 安装Git并完成基础配置&#xff08;用户名、邮箱、SSH密钥&#xff09;注册GitHub/GitLab等…...

从原理图到实测:手把手打造Ti电量计通讯盒EV2400

1. 为什么需要自制EV2400通讯盒 搞锂电池开发的朋友应该都熟悉Ti的电量计芯片&#xff0c;比如bq系列。这些芯片需要通过I2C/SMBus或者HDQ接口与电脑通信&#xff0c;这时候就需要一个通讯盒作为桥梁。官方EV2400虽然好用&#xff0c;但价格实在不亲民&#xff0c;而且功能上可…...

isaac lab5.0与ROS2通信

问题&#xff1a;isaac lab 5.0是基于python3.11 ros2是基于python3.10&#xff0c;因此不能在isaac sim的代码中直接写ros2的代码 在isaac sim中加import socketdef send_to_ros2(v, w):try:sock socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect((127.0.0.1…...