LeetCode:二分查找

news2025/1/19 17:23:10

题目

给定一个 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

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

分析

对于有序数组的查找,一个方便快捷的方法就是二分查找。
不停的找中间的那个值跟我们的目标值比较。
如下图:
比如我们要查找的值是9,返回其下标5。
根据二分查找的思想,我们第一轮搜索的下标范围是[0,6],找到的中间元素是下标为3的元素4,目标值9比4大,则下一轮我们要搜索的下标范围是[4,6],这个时候找到的中间元素是下标为5的元素9,发现正是我们要找的目标值,搜索结束。
在这里插入图片描述
注意:在写代码的时候,我们要注意搜索范围的边界。
搜索范围的区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)

①区间范围[left, right]

区间范围[left, right]说明我们在搜索的时候左右区间都能取到。

  • while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
  • if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1

代码(C语言):

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

②区间范围[left, right)

区间范围[left, right)在搜索的时候只能取到左边的区间。

  • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
  • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]

代码(C语言):

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

虽然只是微小的差别,请各位细细琢磨!!!

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

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

相关文章

小程序引入高德/百度地图坐标系详解

小程序引入高德/百度地图坐标系详解 官网最近更新时间&#xff1a;最后更新时间: 2021年08月17日 高德官网之在原生小程序中使用的常见问题 链接 目前在小程序中使用 高德地图只支持以下功能 &#xff1a;地址描述、POI和实时天气数据 小结&#xff1a;从高德api中获取数…

idea意外退出mac

目录 问题描述 解决过程 问题描述 mac上的idea我很久没用了&#xff0c;之前用的时候还是发布新版的开源项目&#xff0c;这几天再用的时候&#xff0c;就出现了idea意外退出的问题&#xff0c;我上网查找了很久&#xff0c;对于我的问题都没有很好的解决。 解决过程 在寻求…

基于ADS的marx雪崩电路设计-设计实践(射频脉冲源)

基于ADS的marx雪崩电路设计-设计实践&#xff08;射频脉冲源&#xff09; 设计一个ns级别的脉冲源&#xff0c;属于是半路转行的&#xff0c;虽然不了解具体原理但是也可以进行设计。具体的设计理论以及优化方法将在之后进行讨论. 参考文献&#xff1a;基于Marx电路的亚纳秒级…

Acwing算法心得——街灯(差分)

大家好&#xff0c;我是晴天学长&#xff0c;差分广泛用于一段范围的加减运算&#xff0c;可以优化时间复杂度&#xff0c;需要的小伙伴请自取哦&#xff01;如果觉得写的不错的话&#xff0c;可以点个关注哦&#xff0c;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1…

log4j2Scan.jar在log4j漏洞复现中的使用

首先在burp中安装该插件 装完后浏览器打开一个有log4j漏洞的网站 不需要开启拦截&#xff0c;插件就可以自动检测该网站有没有log4j的漏洞 有号说明发现了漏洞

pytorch代码实现注意力机制之MHSA

MHSA注意力机制 MHSA是多头自注意力机制(Multi-Head Self-Altention)&#xff0c;是自然语言处理领域中用于语言模型中的一种特殊机制。它能够让模型在预测下一个词的时候&#xff0c;更好地关注句子中不同位置的词&#xff0c;以适应不同的语言场景。MHSA的核心思想是将一个线…

学生台灯选什么光源好?2023热门护眼台灯推荐

现在的台灯可以说是孩子必不可少的一个学习灯具了&#xff0c;几乎每家每户都会备着一台。不过台的好坏也有区别&#xff0c;相对而言&#xff0c;以前所用的白炽灯、日光灯、节能灯等等传统台灯已经是不适合孩子使用的了&#xff0c;目前而言最好的是LED灯。下面小编为大家推荐…

ROS速成2——机器人运动控制

1. 2.实现思路 创建软件包 定义发布者对象&#xff0c;名字叫vel_pub, 让advertise发布一个类型为geometry_msgs的Twist,话题名称是cmd_vel 声明一个 Twist类型的消息包&#xff0c;名字叫vel_msg,用来承载要发送的速度值 开启while循环&#xff0c;不停使用vel_pub对象发送…

亚马逊美国站直接插入式夜间照明灯具认证标准要求UL1786检测报告办理周期

亚马逊为什么要求电子产品UL检测报告&#xff1f; 美国是一个对安全要求非常严格的国家&#xff0c;美国本土的所有电子产品生产企业早在很多年前就要求有相关安规检测。 而随着亚马逊在全球商业的战略地位不断提高&#xff0c;境外的电子设备通过亚马逊不断涌入美国市场&…

【Python】【Fintech】用Python和蒙特卡洛法预测投资组合未来收益

【背景】 想利用蒙特卡洛方法和yahoo,stooq等财经网站上的数据快速预测特定portfolio的收益。 【分析】 整个程序的功能包括 读取json中的portfolio组合创建蒙特卡洛模拟预测收益的算法创建从财经网站获得特定投资组合数据,并根据2的算法获得该Index或Portfolio收益预测结…

一套成熟的实验室信息管理系统(云LIS源码)ASP.NET CORE

一套成熟的实验室信息管理系统&#xff0c;集前处理、检验、报告、质控、统计分析、两癌等模块为一体的网络管理系统。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。 LIS把检验、检疫、放免、细菌微生物及科研使用的各类分析仪器&#xff0c;通过计算机联…

正中优配:政策预期叠加资金面压制 债市回调至“降息”前

地产方针利好和资金面边沿收紧的压制之下&#xff0c;债券商场出现了回调。 到9月6日收盘&#xff0c;10年期国债收益率上行2.4个基点报2.665%&#xff0c;已回到降息之前的点位。 资金面也在收敛&#xff0c;到6日收盘&#xff0c;DR001加权均匀利率报1.51%&#xff0c;较前…

数学建模竞赛常用代码总结-PythonMatlab

数学建模过程中有许多可复用的基础代码&#xff0c;在此对 python 以及 MATLAB 中常用代码进行简单总结&#xff0c;该总结会进行实时更新。 一、文件读取 python (pandas) 文件后缀名&#xff08;扩展名&#xff09;并不是必须的&#xff0c;其作用主要一方面是提示系统是用…

ROS地图/像素坐标描点调试【Python源码实现】

文章目录 ROS python 地图描点调试工具1. Rviz描点1.1 需求描述1.2 visualization Marker1.3 工程实践 2. 静态地图图片描点2.1 需求描述2.2 工程实践 ROS python 地图描点调试工具 1. Rviz描点 1.1 需求描述 在ROS开发中&#xff0c;有时会加载图片文件转为地图载入move_ba…

算法——组合程序算法解析

组合就是从m个元素的数组中求n个元素的所有组合&#xff0c;代码如下&#xff1a; #include <iostream> #include <vector> using namespace std; // 递归求解组合 void combinations(vector<int>& nums, vector<int>& combination, int star…

RK3568开发笔记(七):在宿主机ubuntu上搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/132733901 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

【C++】—— 单例模式详解

前言&#xff1a; 本期&#xff0c;我将要讲解的是有关C中常见的设计模式之单例模式的相关知识&#xff01;&#xff01; 目录 &#xff08;一&#xff09;设计模式的六⼤原则 &#xff08;二&#xff09;设计模式的分类 &#xff08;三&#xff09;单例模式 1、定义 2、…

MySQL的故事——创建高性能的索引

创建高性能的索引 文章目录 创建高性能的索引一、索引基础二、索引的优点三、高性能的索引策略 一、索引基础 要理解MySQL中索引是如何工作的&#xff0c;最简单的方法就是去看看一本书的“索引 ”部分&#xff1a;如果在一本书中找到某个特定主题&#xff0c;一般会先看书的“…

Linux修复损坏的文件系统

如何判断文件系统是否损坏 当文件系统受损时&#xff0c;将会出现一些明显的迹象。例如&#xff0c;文件或文件夹无法访问、文件大小异常、系统启动慢或无法启动等。此外&#xff0c;系统也可能发出一些错误信息&#xff0c;如"Input/output error"、"Filesyst…

怎么观察敌人的具体情况

怎么观察敌人的具体情况&#xff1f; 【安志强趣讲《孙子兵法》第32讲】 【原文】 杖而立者&#xff0c;饥也&#xff1b;汲而先饮者&#xff0c;渴也&#xff1b;见利而不进者&#xff0c;劳也&#xff1b;鸟集者&#xff0c;虚也&#xff1b;夜呼者&#xff0c;恐也&#xff…