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

news2025/1/17 4:36:04

题目链接 

题目:

分析: 

  • 如果我们查找元素的第一个位置, 随便假设一个位置为x,
    • 如果这个数>target, 说明 [left,x-1] 是我们要找的位置, [x,right] 可以舍去, 让right =mid-1,
    • 如果这个数==target, 说明[left,x] 是我们要找的位置, [x+1,right] 可以舍去, 让right = mid,
    • (因为当这个数>= target时, 我们都移动right, 所以可以合并, 但是right只能=mid)
    • 如果这个数<target, 说明[left,x] 可以舍去, [x+1,right] 是我们要找的位置, 让left = mid+1
  • 此时说明, 数组具有"二段性", 说明可以使用"二分查找"
  • 但是如果是用第一种二分查找: 朴素的二分查找, 发现我们不能确定当nums[mid] == target时, 它一定是我们要找的第一个位置或最后一个位置
  • 细节:
    • 1. 判断循环的条件, 一定是left < right , 不能写=
      • 原因1: 因为我们要找元素的第一个位置, 如果当left == right 时, 说明此时的位置, 一定最终的结果, 无需再移动left和right
      • 原因2: 如果当left == right 时, mid也==right == left, 如果进入循环, 那么如果此时这个数就是target, right = mid, 那么right的位置并没有变化, 此时还满足left<=right的条件, 就会形成死循环!!
    • 2. 求中点的操作, 一定是 int mid = left + (right - left)/2
      • 我们知道求中点我们有两种选择, 一种是 int mid = left + (right-left)/2 , 一种是 int mid = left + (right-left+1)/2, 这两种方式唯一的区别是当数组的大小为偶数时, /2之后是向下取整还是向上取整
      • 那么此时, 如果我们选择向上取整, 即int mid = left + (right-left+1)/2, 那么当下面这种情况出现时, 此时mid指向right, 如果此时mid的位置==target, 应该让right = mid, right并没有发生变化, 此时判断left还是<right, 就会形成死循环!!!
  • 上述, 就是二分查找的第二种类型: 查找元素的第一个位置
  • 同理, 要找元素的最后一个位置,假设一个位置为x,
    • 如果这个数>target, 说明 [left,x-1] 是我们要找的位置, [x,right] 可以舍去, 让right =mid-1,
    • 如果这个数==target, 说明[left,x-1] 可以舍去, [x,right] 是我们要找的位置, 让left = mid,
    • 如果这个数<target, 说明[left,x] 可以舍去, [x+1,right] 是我们要找的位置, 让left = mid+1
    • (因为当这个数<= target时, 我们都移动left, 所以可以合并, 但是left只能=mid)
  •  细节:
    • 1. 判断循环的条件, 一定是left < right , 不能写=  原因同上
    • 2. 求中点的操作, 一定是 int mid = left + (right - left + 1)/2
      • 那么此时, 如果我们选择向下取整, 即int mid = left + (right-left)/2, 那么当下面这种情况出现时, 此时mid指向left, 如果此时mid的位置==target, 应该让left = mid, left并没有发生变化, 此时判断left还是<right, 就会形成死循环!!!
  • 上述, 就是二分查找的第三种类型: 查找元素的最后一个位置

代码: 

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] ret = new int[2];
        ret[0] = -1;
        ret[1] = -1;
        if(nums.length == 0) return ret;
        int left = 0;
        int right = nums.length-1;
        while(left < right){
            int mid = left + (right-left)/2;
            if(nums[mid] >= target){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        if(nums[left] == target){
            ret[0] = left;
        }
        left = 0;
        right = nums.length-1;
        while(left < right){
            int mid = left + (right-left+1)/2;
            if(nums[mid] <= target){
                left = mid;
            }else{
                right = mid-1;
            }
        }
        if(nums[left] == target){
            ret[1] = left;
        }
        return ret;
    }
}

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

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

相关文章

做抖音小店不想赔钱,这几个功能必须关掉!

大家好&#xff0c;我是电商糖果 有很多新手刚开始运营店铺&#xff0c;对店铺的有些设置并不了解。 前期将所有的设置都打开了&#xff0c;等到店铺出单之后&#xff0c;才发现麻烦一大堆。 这里糖果就跟自己开店的经验&#xff0c;劝告各位新手朋友&#xff0c;这几个功能…

数据仓库实验四:聚类分析实验

目录 一、实验目的二、实验内容和要求三、实验步骤1、建立数据表2、建立数据源视图3、建立挖掘结构Student.dmm4、部署项目并浏览结果5、挖掘模型预测 四、实验结果分析五、实验总结体会 一、实验目的 通过本实验&#xff0c;进一步理解基于划分的、基于层次的、基于密度的聚类…

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

实物演示效果 基于stm32智能鱼缸控制系统的设计与实现 目录&#xff1a; 实物演示效果 目录&#xff1a; 一、 绪论 1.1 项目研究目的及意义 1.1.1 选题目的 1.1.2 选题意义 1.2 国内外研究现状 1.2.1 国外发展现状 1.2.2 国内发展现状 1.3 项目研究内容 二、智能鱼缸系统总体设…

森林消防高压灭火泵的功能特点

我国森林面积广阔&#xff0c;自然资源丰富&#xff0c;而森林火灾是常见的自然灾害&#xff0c;具有范围大、损失惨、时间长、火势猛等特点。森林火灾会烧毁成片的森林&#xff0c;伤害林内的动物&#xff0c;而且还降低森林的更新能力&#xff0c;引起土壤的贫瘠和破坏森林涵…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 网格布局Grid Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 网格布局Grid Layout 文章编号&#xff1a…

iPhone实况照片从Windows资源管理器复制的JPG+MOV无法正常还原到iPhone

背景&#xff1a; 之前使用的iPhone 15 Pro&#xff0c;使用的Windows资源管理器当中复制导出的实况照片&#xff0c;复制出来的格式例如IMG_0001.JPG, IMG_0001.MOV。之后手机就卖掉了。现在使用的iPhone 14 Pro Max&#xff0c;想要导回之前备份的实况照片。尝试使用爱思助手…

92.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-利用哈希表实现快速读取文本内容

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

车间人员作业行为智能检测 AI视觉在生产车间制造中的应用

车间人员作业行为智能检测系统基于神经网络人工智能视觉算法&#xff0c;车间人员作业行为智能检测通过对车间监控摄像头获取的视频图像进行分析和识别&#xff0c;实现了对人员操作行为的智能检测。系统对工人的操作环节进行分解&#xff0c;根据时间、动作标准等方面制定了规…

Django5+React18前后端分离开发实战13 使用React创建前端项目

先将nodejs的版本切换到18&#xff1a; 接着&#xff0c;创建项目&#xff1a; npx create-react-app frontend接着&#xff0c;使用webstorm打开这个刚创建的项目&#xff1a; 添加一个npm run start的配置&#xff1a; 通过start启动服务&#xff1a; 浏览器访问&…

STranslate即开即用、即用即走的翻译(OCR)工具 v1.1.3.514

软件介绍 STranslate 是一款面向 Windows 操作系统用户设计的翻译软件&#xff0c;该软件具备开源性质并且免费。它结合了翻译功能与光学字符识别&#xff08;OCR&#xff09;技术&#xff0c;允许用户高效且直接地在屏幕上进行文字的翻译和识别。在开发过程中&#xff0c;STr…

Nginx/阿里云/二级域名的配置和使用

阿里云域名解析配置如下&#xff1a; nginx配置如下&#xff1a; 访问地址&#xff1a; zhadmin.iotzzh.com image.png

二叉搜索数之删除节点

看题目&#xff1a; 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步…

详解ArcGIS 水文分析模型构建

目录 前言 项目环境、条件 Dem 数据预览 ArcGIS模型构建器 模型搭建 填洼 流向 流量 河流长度 栅格计算器 河流链接 河网分级 栅格河网矢量化 绘制倾泻点 栅格流域提取 集水区 盆域分析 栅格转面 模型应用 导出 py 文件 完善脚本 最终效果 结束语 前言 …

【NumPy】关于numpy.loadtxt()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

有没有适合女性做的副业?盘点9个适合女生做的赚钱兼职副业

亲爱的女神们&#xff0c;你们是否也想在忙碌的生活中寻找一些额外的乐趣和收入呢&#xff1f;今天&#xff0c;就为大家揭秘九种特别适合女性的副业&#xff0c;让你在追求美丽的同时&#xff0c;也能轻松赚取零花钱&#xff0c;秒变“小金库”&#xff01; 一、宅富社任务赚钱…

Default Folder X for Mac v6.0.7激活版:高效、智能的文件管理新选择

在快节奏的工作与生活中&#xff0c;高效管理文件已成为每个Mac用户的迫切需求。Default Folder X for Mac正是为了满足这一需求而生&#xff0c;它以其卓越的性能和丰富的功能&#xff0c;为Mac用户带来了前所未有的文件管理体验。 Default Folder X for Mac拥有直观易用的界面…

攻防世界---web---warmup

1、题目描述 2、查看源码&#xff0c;发现有个source.php 3、访问该文件&#xff0c;得到这一串代码 4、分析代码 5、访问hint.php&#xff0c;提示flag在ffffllllaaaagggg这个文件下 6、构造payload ?filesource.php?/../../../../../../ffffllllaaaagggg

Java基础之进制转换和位运算专题

什么是进制&#xff1f; 是数学中的一个概念&#xff0c;就是数据“逢几进位”。 例如&#xff1a;生活中用的计数方法 ---- 十进制。十进制就是数字逢十就要进一位。 例如&#xff1a;一个星期有7天&#xff0c;就是逢七进一&#xff1b;一个月有30天就是逢30进一&#xff1b;…

多尺度注意力机制突破性成果!低成本、高性能兼备

与传统的注意力机制相比&#xff0c;多尺度注意力机制引入了多个尺度的注意力权重&#xff0c;让模型能够更好地理解和处理复杂数据。 这种机制通过在不同尺度上捕捉输入数据的特征&#xff0c;让模型同时关注局部细节和全局结构&#xff0c;以提高对细节和上下文信息的理解&a…