【LeetCode】在排序数组中查找元素的第一个和最后一个位置 [M](二分)

news/2025/1/12 3:44:40/

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

一、题目

给你一个按照非递减顺序排列的整数数组 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]

提示:

  • 0 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9
  • nums 是一个非递减数组
  • -10^9 <= target <= 10^9

二、代码

class Solution {public int[] searchRange(int[] nums, int target) {// 过滤无效参数if (nums == null || nums.length == 0) {return new int[] { -1, -1 };}// 找数组中小于target的最右下标位置,然后再加1int L = lessMostRight(nums, target) + 1;// 如果L没越界并且L位置的数等于target,就说明找到了小于target的最右边的数,并且数组中存在target// 否则数组中就没有target,直接返回(-1,-1)if (L == nums.length || nums[L] != target) {return new int[] { -1, -1 };}// 找数组中小于target + 1的最右位置int R = lessMostRight(nums, target + 1);// 返回数组中等于target的区间范围return new int[] {L, R};}// 二分,利用二分在数组arr中找到小于num的最右位置的数public int lessMostRight(int[] arr, int num) {int l = 0;int r = arr.length - 1;// 记录下标答案int ans = -1;// 二分到l和r错开结束while (l <= r) {// 取中间位置int mid = (l + r) >> 1;// 如果此时arr[mid]大于等于mid,说明还没找到小于num的数,我们再去二分到左部分去判断,看能否找到小于num的数if (num <= arr[mid]) {r = mid - 1;// 找到了一个下标位置的数小于num,就记录下这个下标为答案,看后面还能不能向右推高这个答案} else if (num > arr[mid]) {// 继续二分右部分,看后面能否推高小于num的最右下标答案l = mid + 1;ans = mid;}}return ans;}
}

三、解题思路 

假设target为7,先利用二分找<7的最右位置。

如果它的下一个!=7,说明数组里没7 ,直接返回(-1,-1)。

如果<7的最右下一个==7, 说明数组中是存在7的,再利用二分找<8的最右位置,这样就找到了数组中等于7的区间的左右边界。


http://www.ppmy.cn/news/6177.html

相关文章

【Linux】缓冲区/磁盘inode/动静态库制作

目录 一、缓冲区 1、缓冲区的概念 2、缓冲区的意义 3、缓冲区刷新策略 4、同一份代码&#xff0c;打印结果不同 5、仿写FILE 5.1myFILE.h 5.2myFILE.c 5.3main.c 6、内核缓冲区 二、了解磁盘 1、磁盘的物理结构 2、磁盘的存储结构 2.1磁盘的定位 3、磁盘的抽象…

Nginx服务讲解

Nginx服务讲解 1、同步与异步讲解 同步与异步&#xff1a; 同步与异步的重点在消息通知的方式上&#xff0c;也就是调用结果的通知方式不同。 **同步&#xff1a;**当一个同步调用发出去后&#xff0c;调用者要一直等待调用的结果通知后&#xff0c;才能进行后续的执行。 …

10.1、Django框架入门--后台管理

文章目录预备知识MVC模式和MTV模式MVC模式MTV 模式Django框架Django框架简介Django框架中的后台管理启动后台admin站点管理数据库迁移创建管理员用户管理界面本地化创建并使用一个应用bookapp项目的数据库模型创建数据库模型生成数据库表数据库上的基本操作启用后台admin站点管…

“理想家”冬日献礼福利来袭,20 款豪礼限时梦想值回赠

悄然间冬天已至&#xff0c;为了让广大客户在冬日里感受到来自 Doo Prime 的温暖问候&#xff0c;”理想家”积分商城现推出“冬日献礼梦想值回赠”活动&#xff0c;希望治愈您的冬日倦意&#xff0c;带给您冬日惊喜。 我们特意甄选出 20 款暖冬好物&#xff0c;包括 YSL 圣诞…

2023年5大网络安全趋势加速发展

©网络研究院 Netwrix发布了2023年将影响各种规模组织的关键网络安全趋势。以下是你需要注意的五个具体趋势: 网络犯罪的业务将进一步专业化 Emotet、Conti和Trickbot等恶意软件的回归表明网络雇佣犯罪的扩张。特别是&#xff0c;勒索软件即服务的增长使没有深厚技术技能…

WMS类图分析-android12

为什么要分析类图&#xff1f; WMS是一个复杂的模块&#xff0c;就像一个很大的家族&#xff0c;里面有各种角色&#xff0c;认识类图就像是认识WMS模块中的各个角色&#xff0c;不先把人认清楚了&#xff0c;怎么更好的理解他们之间的交互&#xff1f; 我觉得&#xff0c;这…

漏洞预警|Apache Karaf 存在远程代码执行漏洞

棱镜七彩安全预警 近日网上有关于开源项目 Apache Karaf 存在远程代码执行漏洞&#xff0c;棱镜七彩威胁情报团队第一时间探测到&#xff0c;经分析研判&#xff0c;向全社会发起开源漏洞预警公告&#xff0c;提醒相关安全团队及时响应。 项目介绍 Karaf是Apache旗下的一个开…

网络安全渗透测试的八个步骤(二)

一、信息分析 1.精确化&#xff1a;备好上一步检测过的系统漏洞的exp&#xff0c;用于精确化; 2.绕开自我防御机制&#xff1a;是否存在网络防火墙等设施&#xff0c;怎样绕开; 3.订制进攻途径&#xff1a;最好专用工具途径&#xff0c;依据欠缺通道&#xff0c;高内部网管理…