【LeetCode-中等题】34. 在排序数组中查找元素的第一个和最后一个位置

news2025/1/26 15:27:01

文章目录

    • 题目
    • 方法一:二分查找(先找到mid,在根据mid确定左右区间)
    • 方法二:分两次二分查找,一次用于找左区间,一次用于找右区间

题目

在这里插入图片描述

方法一:二分查找(先找到mid,在根据mid确定左右区间)

  1. 第一步先找到target所在的位置mid
  2. 在根据mid 在数组左右分两个while循环找左右区间,一旦nums[mid] != target,就返回mid值
  3. 最后查找位置会停在区间外的一个位置,需要矫正回来
// 方法一 :二分法找目标元素的位置,然后在目标元素的位置的左右找左右区间
    public int[] searchRange(int[] nums, int target) {
        if(nums.length == 0) return new int[]{-1,-1};
        int mid = search( nums,  target);//二分法找target位置
        if(mid == -1) return new int[]{-1,-1};//若没有  直接返回 - 1  - 1
        int m = mid;
        while(m < nums.length){//根据mid 去找右区间最大下标
                if(nums[m] != target) break;
                 m ++;
        }
        int n = mid;
        while(n >=0){//根据mid 去找左区间最小下标
                if(nums[n] != target) break;
                   n--;
        }
        return new int[]{n+1,m-1};//最终m其实是在右区间后面一个位置停止的  m需要-1  同理最终实是在左区间前面一个位置停止的,n需要+1
    }
    //二分法找目标元素  目标元素不存在返回 - 1
    public int search(int[] nums, int target){
        int left = 0 ;
        int right = nums.length - 1 ;
       while(left <= right){
        int mid = (right - left)/2 + left;
        if(nums[mid] == target) return mid;
        if(nums[mid] > target) right = mid -1;
        if(nums[mid] < target) left = mid +1;
       }
    return -1;
    }

方法二:分两次二分查找,一次用于找左区间,一次用于找右区间

一定要结合画图来理解

// 方法二 :二分法来去寻找左右边界
    public int[] searchRange(int[] nums, int target) {
        if(nums.length == 0) return new int[]{-1,-1};
        int left = leftjoin(nums,target);
        int right = rightjoin(nums,target);
          // 情况一
        if (left == -2 || right == -2) return new int[]{-1, -1};
        // 情况三
        if (right - left > 1) return new int[]{left + 1, right - 1};
        // 情况二
        return new int[]{-1, -1};

}

    //寻找左边界
    public int leftjoin(int[] nums, int target){
        int left = 0;
        int right = nums.length -1;
        int leftjoin = -2;//记录左边界的赋值情况
        while(left <= right){
            int mid = left + (right -left);
            if(nums[mid] >= target){
                right = mid -1;
                leftjoin = right;
            }else {
                left = mid + 1;
            }
        }
        return leftjoin;
    }
   //寻找右边界
    public int rightjoin(int[] nums, int target){
        int left = 0;
        int right = nums.length -1;
        int rightjoin = -2;//记录左边界的赋值情况
        while(left <= right){
            int mid = left + (right -left);
            if(nums[mid] > target){
                   right = mid -1;
            }else {
             left = mid + 1;
             rightjoin = left;
            }
        }
        return rightjoin;
    }

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

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

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

相关文章

第六讲:如何构建类的事件(上)

【分享成果&#xff0c;随喜正能量】世界上凡是人聚集的地方&#xff0c;讨论的话题无外乎三个&#xff1a;拐弯抹角的炫耀自己、添油加醋的贬低别人、相互窥探的搬弄是非。人性的丑陋就是&#xff1a;在无权无势、善良的人身上挑毛病&#xff1b;在有权有势的人身上找优点。。…

【硬件设计】硬件学习笔记二--电源电路设计

硬件学习笔记二--电源电路设计 一、LDO设计1.1 LDO原理1.2 LDO参数1.3 应用 二、DC-DC设计2.1 DC-DC原理2.2 DC-DC参数介绍2.4 DC-DC设计要点2.5 DC-DC设计注意事项 写在前面&#xff1a;本篇笔记来自王工的硬件工程师培训课程&#xff0c;想要学硬件的同学可以去腾讯课堂直接搜…

【LeetCode-中等题】69. x 的平方根

文章目录 题目方法一&#xff1a;二分查找 题目 方法一&#xff1a;二分查找 假设求8的平方根&#xff0c;那就设置left 0 &#xff0c;right 8&#xff1b; 每次取最中间的元素的平方和8对比&#xff0c;如果大于8&#xff0c;则right mid-1&#xff0c;如果小于8 left mi…

第二节 极限 (一)

一、极限的定义(了解) 二、求极限的方法 (重点 大题8分 选择4分 填空4分) (1) 直接代入 (只要有意义) (2) 洛必达法则&#xff08;80%解题法&#xff09; (3) 无穷小和无穷大的性质 (4) 三种特例 (5) 两个重要极限 (6) 等价无穷小的替换 三、真题 方法一&#xff…

蓝桥杯官网填空题(振兴中华)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小明参加了学校的趣味运动会&#xff0c;其中的一个项目是&#xff1a;跳格子。 地上画着一些格子&#xff0c;每个格子里写一个字&#xff0c;如下所示&#xff1…

字符编码(idea)

File----------settings-------------Editor------------File Encodings

常见IO模型(非常详细)

背景知识 常⽤5中⽹络IO模型 阻塞IO&#xff08;Blocking IO&#xff09;⾮阻塞IO&#xff08;Non-Blocking IO&#xff09;多路复⽤IO&#xff08;IO Multiplexing&#xff09;信号驱动IO&#xff08;Signal Driven IO&#xff09;异步IO&#xff08;Asynchronous IO&#x…

IPD-PDT-POP角色的名称、定位和职责说明书

在IPD推进中&#xff0c;有一个不是很关键但却离不开的角色叫做POP&#xff0c;POP这个角色通常是设置在PDT团队中。 那么IPD的PDT团队中的POP这个角色到底是什么意思呢&#xff1f;POP如何开展工作&#xff0c;以及POP的主要岗位职责有哪些呢&#xff1f;华研荟今天给大家分享…

一文解码语言模型:语言模型的原理、实战与评估

目录 一、语言模型概述什么是语言模型&#xff1f;核心概念和数学表示挑战&#xff1a;高维度和稀疏性链式法则与条件概率举例 应用场景小结 二、n元语言模型&#xff08;n-gram Language Models&#xff09;基本概念数学表示 代码示例&#xff1a;计算Bigram概率输入与输出 优…

极简极速-Bitset (bitmap)实现考勤打卡场景

文章目录 1. redis命令行操作bitmap2. RedisTemplate操作bitmap3. Java中的Bitset 1. redis命令行操作bitmap 2. RedisTemplate操作bitmap bitmap的常见业务场景主要有日活统计&#xff08;类似的月考勤&#xff09;、点赞、BloomFilter等&#xff0c;以用户mj考勤统计为例&am…

掌握AI助手的魔法工具:解密`Prompt`(提示)在AIGC时代的应用(下篇)

前言&#xff1a;在前面的两篇文章中&#xff0c;我们深入探讨了AI助手中的魔法工具——Prompt&#xff08;提示&#xff09;的基本概念以及在AIGC&#xff08;Artificial Intelligence-Generated Content&#xff0c;人工智能生成内容&#xff09;时代的应用场景。在本篇中&am…

【前端小tip】深拷贝不能处理函数的解决方法,文末包含所有深拷贝常见问题的解决方法

在开发过程中&#xff0c;我对对象进行深拷贝的时候常常使用序列化和反序列化&#xff0c;也就是 const newObj JSON.parse(JSON.stringify(obj))这个方法很好用&#xff0c;但是在最近我发现了一个弊端&#xff0c;就是它只能处理只含有基础类型属性和对象属性的对象&#x…

Python专辑:大话数字类型

I will honour myself by showing up powerfully in my life today。我会为在今日努力生活的自我而感到自豪。 前面我们讲解过关于用Python写温度转换器&#xff0c;画“Python”以及天天学习的代码讲解。不知大家是否还记得&#xff0c;忘记的可以点击上面的专辑去里面复习一下…

反编译小程序详细教程,处理各种异常报错

文章目录 一、准备工作 &#xff08;一&#xff09;安装Nodejs &#xff08;二&#xff09;解密和逆向工具 二、小程序缓存文件解密 &#xff08;一&#xff09;定位小程序缓存路径 &#xff08;二&#xff09;源码解密 &#xff08;三&#xff09;源码反编译 三、小结 四、异常…

PTA作业笔记——简单的计算

PTA作业笔记——简单的计算 7-10 整数算术运算7-11 猫是液体7-11 猫是液体7-13 计算4个整数的平均值7-14 公元前后日期格式化7-15 A除以B7-18 出租车计价 7-10 整数算术运算 本题要求编写程序&#xff0c;计算并输出2个正整数的和、差、积、商与余数。题目保证输入和输出全部在…

数据集笔记 geolife (操作篇)

数据集介绍可看&#xff1a;数据集笔记:GeoLife GPS 数据 &#xff08;user guide&#xff09;_UQI-LIUWJ的博客-CSDN博客 1 读取数据 import os os.chdir(D:/Geolife Trajectories 1.3/Geolife Trajectories 1.3/Data/000/Trajectory)import pandas as pd data pd.read_csv(…

深度学习(Python)学习笔记2

第二章 感知机 2.1 感知机是什么 感知机接收多个输入信号,输出一个信号。 感知机的信号会形成流,向前方输送信息。 感知机的信号只有“流/不流”(1/0)两种取值。 本学习笔记中,0对应“不传递信号”,1对应“传递信号”。 图中、是输入信号,是输出信号,、是权重。图…

WebSocket和Html通讯

一、使用到的相关链接 参考 opencv-websocket: 基于opencv-web的实现 https://github.com/zaphoyd/websocketpp 安装教程 Websocket安装使用 - 知乎 (zhihu.com) 二、编译教程&#xff08;Ubuntu为例&#xff09; 遇到相关问题可以参考&#xff1a;Websocket安装使用 - 知乎…

删除无效的括号

题目链接 删除无效的括号 题目描述 注意点 s 由小写英文字母以及括号 ‘(’ 和 ‘)’ 组成1 < s.length < 25返回所有可能的结果。答案可以按 任意顺序 返回 解答思路 首先计算删除无效的括号最少次数需要删除的左括号和右括号的数量&#xff0c;方法是&#xff1a;…

vue3中 | 使用Pinia 进行状态管理 | pinia优化重复请求

问题&#xff1a;当多次调用同一个接口实现渲染时&#xff0c;会重复发送请求。 解决&#xff1a;使用 Pinia 进行数据集中管理&#xff0c;再把数据下发给组件&#xff0c;以供使用。 &#xff08;Pinia可以跨组件/页面共享状态。&#xff09; 1. 用 Pinia 管理数据&#xf…