Leetcode JAVA刷刷站(34)排序数组中查找元素的首尾位置

news2024/11/26 18:37:15

一、题目概述 

二、思路方向 

       为了设计一个时间复杂度为 O(log n) 的算法来找到目标值在已排序数组中的开始位置和结束位置,我们可以使用二分查找的变种。首先,我们可以使用二分查找来找到目标值在数组中的任意一个位置(如果存在的话)。然后,我们可以从该位置开始,分别向左和向右遍历数组,以找到目标值的开始位置和结束位置。

       但需要注意的是,由于我们只需要在找到目标值之后进行线性扫描来找到边界,整体算法的时间复杂度仍然可以看作是 O(log n),因为二分查找是主要的耗时部分,而线性扫描的复杂度是 O(k),其中 k 是目标值在数组中连续出现的次数,这个 k 相对于 n 来说是很小的。

三、代码实现   

public class Solution {  
    public int[] searchRange(int[] nums, int target) {  
        int left = 0, right = nums.length - 1;  
        int[] result = {-1, -1};  
  
        // 使用二分查找找到目标值的一个位置  
        while (left <= right) {  
            int mid = left + (right - left) / 2;  
            if (nums[mid] == target) {  
                // 找到了目标值,开始寻找边界  
                int start = mid, end = mid;  
                while (start >= 0 && nums[start] == target) {  
                    start--; // 向左找开始位置  
                }  
                while (end < nums.length && nums[end] == target) {  
                    end++; // 向右找结束位置  
                }  
                // 注意,因为start是向左多走了一步,end是向右多走了一步,所以要调整回来  
                result[0] = start + 1;  
                result[1] = end - 1;  
                return result;  
            } else if (nums[mid] < target) {  
                left = mid + 1;  
            } else {  
                right = mid - 1;  
            }  
        }  
  
        return result; // 如果没有找到目标值,返回[-1, -1]  
    }  
  
    public static void main(String[] args) {  
        Solution solution = new Solution();  
        int[] nums = {5, 7, 7, 8, 8, 10};  
        int target = 8;  
        int[] result = solution.searchRange(nums, target);  
        System.out.println("Start: " + result[0] + ", End: " + result[1]);  
    }  
}

执行结果: 

四、小结

       这段代码首先使用二分查找定位目标值,然后从找到的位置开始分别向左和向右扩展,以找到目标值的开始和结束位置。注意,我们在确定边界时,start 是向左多走了一步,end 是向右多走了一步,所以在设置结果时需要调整回来(即 start + 1 和 end - 1)。如果二分查找未找到目标值,则直接返回 [-1, -1]

 结语   

人生不止

奋斗不息

!!!

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

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

相关文章

linux下对目录文件进行操作(打开目录,读取目录项,关闭目录),进入目录的函数chdir,七篇文件I/O文章小结

目录文件介绍 目录也是一种文件&#xff0c;因此操作流程与普通文件类似&#xff0c;有诸如打开、关闭、定位等概念&#xff0c;但目录是一种特殊的文件&#xff0c;目录存储的数据的最小单位并不是字符&#xff0c;而是目录项。这使得目录跟普通文件又有区别。目录项指的是结…

基于resttemplate实现微服务调用

子工程搭建与管理 新建一个cloud模块来作为公共模块&#xff0c;cloud模块中将管理用于微服务使用各个组件 euerka中的配置 package com.lingyang.euerka.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configu…

【Python快速入门和实践018】Python常用脚本-图片合成视频

一、功能介绍 这段代码定义了一个名为 create_video_from_images 的函数&#xff0c;用于将一个文件夹中的图像序列合并成一个视频文件。以下是该函数的主要功能和组成部分的分析&#xff1a; 函数参数 input_folder: 包含图像文件的文件夹路径。output_file: 输出视频文件的…

马斯克发布Grok-2:实时获取X资讯、多模态支持,性能追平GPT-4o

在LLM&#xff08;大型语言模型&#xff09;竞争中&#xff0c;马斯克的XAI无疑是一个强劲的对手。继宣布斥资数十亿美元购买英伟达H100 GPU用于训练自家模型后&#xff0c;XAI迅速推出了其最新的大模型——Grok-2。这一模型不仅在技术性能上对标OpenAI、Anthropic等主流大模型…

Hystrix——服务容错保护库

熔断机制是解决微服务架构中因等待出现故障的依赖方响应而形成任务挤压&#xff0c;最终导致自身服务瘫痪的一种机制&#xff0c;它的功能类似电路的保险丝&#xff0c;其目的是为了阻断故障&#xff0c;从而保护系统稳定性。Hystrix作为Spring Cloud中实现了熔断机制的组件&am…

(亲测有效)SpringBoot项目集成腾讯云COS对象存储(2)

接上文&#xff08;亲测有效&#xff09;SpringBoot项目集成腾讯云COS对象存储&#xff08;1&#xff09;-CSDN博客 目录 3、通用能力类 文件下载 测试 3、通用能力类 文件下载 官方文档介绍了2种文件下载方式。一种是直接下载 COS 的文件到后端服务器&#xff08;适合服务…

前端Mac解决localhost冲突问题!!!

1、报错提示&#xff1a; 运行项目的时候遇到了如下的问题&#xff0c;导致我项目运行不起来&#xff0c;查阅了一下资料发现是loaclhost有误 2、ping一下localhost 先打开终端&#xff0c;在终端输入命令&#xff1a;&#xff08;我输入这个命令的时候能ping通&#xff0c;当…

Android 使用`layer-list`打造精美的背景

引言 在 Android 开发中&#xff0c;layer-list 是一种强大的工具&#xff0c;可以帮助我们创建复杂的背景图形&#xff0c;&#x1f3a8; 这种方法可以大大提升应用的视觉效果。作为一名Android开发&#xff0c;理解和掌握 layer-list 的使用不仅可以让我们在 UI 设计上更加灵…

C++竞赛初阶L1-11-第五单元-for循环(25~26课)519: T454430 人口增长问题

题目内容 假设目前的世界人口有 x 亿&#xff0c;按照每年 0.1% 的增长速度&#xff0c;n 年后将有多少人&#xff1f; 输入格式 一行两个正整数 x 和 n&#xff0c;之间有一个空格。其中&#xff0c;1≤x≤100,1≤n≤100。 输出格式 一行一个数&#xff0c;表示答案。以亿…

【C++ 面试 - 基础题】每日 3 题(十八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

对象的初始化和清理(构造和析构)

目录 一. 前言 二. 构造函数和析构函数的语法 三. 构造函数的分类和调用 四. 构造函数的调用规则 五. 深拷贝和浅拷贝&#xff08;面试常考&#xff09; 六. 初始化列表 一. 前言 任何事物都需要有一个初始化的过程&#xff0c;例如手机&#xff0c;我们在买来使用的时候手…

win10 上安装部署WSA, 在win10上运行安卓程序

windows上跑安卓程序&#xff0c; 多年前用过蓝叠bluestacks安卓模拟器 甚至还在上面跑过微信 后来听说在bluestacks上用微信&#xff0c; 可能会被封&#xff0c; 就没有后来了 最近折腾在windows上如何投屏&#xff0c;主要是将ios无线投到win10电脑上&#xff08;安卓win10直…

免费文档翻译导出怎么弄?5个文档翻译器替你解决

在日常的工作与学习中&#xff0c;我们时常会遇到需要查阅或撰写跨语言文档的情况。然而面对这些专业性强、词汇量大的文件&#xff0c;逐字逐句地手动翻译不仅耗时费力&#xff0c;还可能因理解偏差导致信息失真。 幸运的是&#xff0c;如今有不少免费文档翻译软件横空出世&a…

LDR6020双盲插便携显示器方案:重塑连接体验的新标杆

在数字化高速发展的今天&#xff0c;便携显示器已成为商务人士、游戏爱好者及远程教育学习者的得力助手。然而&#xff0c;传统便携显示器在接口兼容性与易用性方面常存在诸多不便&#xff0c;如接口方向区分困难、信号类型不匹配等问题。为了彻底解决这些痛点&#xff0c;LDR6…

基于springboot物流管理系统

TOC springboot208基于springboot物流管理系统 第1章 绪论 1.1 研究背景 互联网时代不仅仅是通过各种各样的电脑进行网络连接的时代&#xff0c;也包含了移动终端连接互联网进行复杂处理的一些事情。传统的互联网时代一般泛指就是PC端&#xff0c;也就是电脑互联网时代&…

记录一次 Redis 优化发送数据(使用管道批量传送)

一 项目背景 此前的项目中&#xff0c;鉴于客户方服务器的安全配置对 MQ 中间件有所限制&#xff0c;我们只得采用 Redis 的 list 作为简易的 MQ 来传送报文数据。然而&#xff0c;近段时间客户关闭了相关端口&#xff0c;导致大量数据积压&#xff0c;需要进行补发。在补发过程…

Unity Obfuscator 使用说明

一、Assembly - Settings 1. 核心Unity程序集&#xff08;Assembly-CSharp&#xff09; Obfuscate Assembly-CSharp: 开启 这是Unity的核心程序集&#xff0c;所有没有存储在程序集定义文件&#xff08;assembly definition file&#xff09;中的代码都会被存储在这里。大多数…

排序算法介绍和sort函数应用(明明的随机数,奖学金)

排序算法介绍sort函数应用——[NOIP2006 普及组] 明明的随机数和[NOIP2007 普及组] 奖学金 1.排序算法介绍和常用排序方法复杂度2.sort函数应用2.1.[NOIP2006 普及组] 明明的随机数题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示2.1.1.题意解析2.1.2.AC代码 2.2.[NO…

win的netassist TCP测试工具和Linux的nc工具使用

写在前面 有时工作中我们编写一些tcp相关的程序&#xff0c;而netassist就是这样一款辅助我们进行TCP功能测试的工具&#xff0c;你可以从这里下载。 1&#xff1a;netassist使用 我们需要一个server程序&#xff0c;可以参考这篇文章&#xff0c;启动server后&#xff0c;就…

【python】Python如何调用外部命令,subprocess模块的详细解读以及应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…