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

二分查找法 算法描述 折半的思想去定位要查找的元素 步骤: 前提:有已排序数组 A(假设已经做好) 定义左边界 L、右边界 R,确定搜索范围,循环执行二分查找(3、4两步) 获取中间索引 M = Floor((L+R) /2) 中间索引的值 A[M] 与待搜索的值 T 进行比较 ① A[M] == T 表示找到,返回中间索引 ② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1 设置为右边界,重新查找 ③ A[M] &l. 阅读详情

题目

来源: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 < = n u m s . l e n g t h < = 105 0 <= nums.length <= 105 0<=nums.length<=105
  • − 109 < = n u m s [ i ] < = 109 -109 <= nums[i] <= 109 −109<=nums[i]<=109
  • n u m s 是 一 个 非 递 减 数 组 nums 是一个非递减数组 nums是一个非递减数组
  • − 109 < = t a r g e t < = 109 -109 <= target <= 109 −109<=target<=109

接下来看一下解题思路:

思路:二分法:

    最直观的想法是通过 循环遍历 来查找,记录第一个 target 和 最后一个 target 的下标, 但是时间复杂度是 O(n)。

    看到题目,在升序的数组里,要求时间复杂度为 O(log n) 找目标值,首先想到的是二分查找。

    二分查找适用场景:有序或者部分有序,基本使用二分搜索及其变种;
    因为每次搜索数据的一半,时间复杂度 O ( l o g n ) O(logn) O(logn)

     考虑要寻找 t a r g e t target target 的开始和结束位置,需要找数组中 【第一个 等于 t a r g e t target target 的位置】和 【最后一个 等于 t a r g e t target target 的位置】
     由于两者的判断条件不同,为了代码复用,可以定义一个 bool 类型,来区分 第一个和最后一个,然后在查找的过程中 使用 二分法 查找
java实现

int[]  searchRange(int[] nums, int target) {
    if (nums.length < 1) {
        return new int[]{-1, -1};
    }

    return new int[]{findIndex(nums, target, true), findIndex(nums, target, false)};
}

int findIndex(int[] nums, int target, boolean pre) {
    int left = 0;
    int right = nums.length - 1;
    int ans = -1;
    while (left <= right) {
        int mid = (left + right) >> 1;
        if (nums[mid] == target) {
            ans = mid;
            if (pre) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return ans;
}

C++实现

public:
vector<int> searchRange(vector<int>& nums, int target) {
	if ((int)nums.size() < 1) {
		return vector<int>{-1, -1};
	}
	return vector<int>{findIndex(nums, target, true), findIndex(nums, target, false)};
}

public:
	int findIndex(vector<int>& nums, int target, bool pre) {
		int left = 0;
		int right = (int)nums.size() - 1;
		int ans = -1;
		while (left <= right) {
			int mid = (left + right) >> 1;
			if (nums[mid] == target) {
				ans = mid;
				if (pre) {
					right = mid - 1;
				}
				else {
					left = mid + 1;
				}
			}
			else if (nums[mid] > target) {
				right = mid - 1;
			}
			else {
				left = mid + 1;
			}
		}
		return ans;
	}
}

python实现

class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        if len(nums) < 1:
            return [-1, -1]
        
        return [self.findIndex(nums, target, True), self.findIndex(nums, target, False)]
    
    def findIndex(self, nums, target, pre):
        left = 0
        right = len(nums) - 1
        ans = -1
        while left <= right:
            mid = (left + right) >> 1
            if nums[mid] == target:
                ans = mid
                if pre:
                    right = mid - 1
                else:
                    left = mid + 1
            elif nums[mid] > target:
                right = mid - 1
            else:
                left = mid + 1
        
        return ans
复杂度分析

时间复杂度: O ( log ⁡ n ) O(\log n) O(logn),其中 n n n 为 nums \textit{nums} nums 数组的大小。整个算法时间复杂度即为二分查找的时间复杂度 O ( log ⁡ n ) O(\log n) O(logn)。
空间复杂度: O ( 1 ) O(1) O(1)。只需要常数级别的空间存放变量。

二分查找算法递归实现 二分查找算法个人总结 阅读详情

相关推荐

Hypermesh二次开发实战:Tcl命令分类与常用函数详解(附避坑指南)

本文深入解析Hypermesh二次开发中Tcl命令的三大核心类别:界面命令、查询命令与修改命令。重点剖析了*createmark集合管理与hm_getvalue信息查询等关键函数的实战用法,并提供了避免Mark覆盖、生命周期管理等常见陷阱的实用指南,旨在帮助CAE工程师构建高效可靠的自动化前处理流程。

weixin_29233333的博客 238

LeetCode——34. 在排序数组中查找元素的第一个和最后一个位置

题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。 提示: 0 <= nums.length <= 105 -109 <= nums[i] <= 109 nums 是一个非递减数组 -109 <= target <= 109 示例 1: 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 示例 2

FYPPPP的博客 347

IDEA系列(四):IDEA导入Maven工程项目并配置Tomcat启动

本片文章主要介绍如何导入一个存在的maven项目并配置Tomcat启动项目,方便自己使用,也分享出来,希望可以帮助到其他人。

低调D树苗的博客 1243

二分查找(对于所找数据不存在的情况)

    public static int find_low(List&lt;Integer&gt; inter, int lo, int hi, int tar){        if(lo&gt;=hi)            return lo;        int mid = (lo + hi)/2;        if(inter.get(mid) &gt; tar){       ...

aoxue_bai的博客 1266

战舰V3移植CANopenNode并驱动电机全流程

第三部分是电机的对象字典(也就是节点的OD)中的索引,长度2个字节。索引发送的是小段模式,比如这一部分为0X40 0X60,实际操作的索引地址为0X6040。第一部分是COB-ID,长度1个字节,电机的node-ID默认为0x01,所以报文ID一直是601。第五部分是要写入的数据,数据发送的时候是小端模式,低字节数据先发送,长度由第二部分决定。配置定时器6,时间为1ms,根据公式计算得到参数PSC取72-1,ARR取1000-1。第二部分是CMD,长度1个字节,其实就是数据部分的长度,

qq_50526837的博客 3044

Blender地形建模实战:5步搞定Gazebo仿真地形(附避坑指南)

本文提供了一份详细的Blender地形建模实战指南,旨在帮助开发者快速创建Gazebo仿真地形。文章通过五个核心步骤,从环境准备、地形雕刻、模型优化导出,到创建Gazebo模型包及问题排错,系统讲解了如何将Blender中的地形模型成功导入Gazebo进行机器人仿真,并重点分享了关键的避坑经验。

weixin_28475533的博客 342

C 指针 数组 字符(串)

首先看下C中的字符串是怎么定义的 在 C 语言中,字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。 下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 RUNOOB 的字符数多一个。 char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'}; 依据数组初始化规则,您可以把上面的语句写成以下语句: char site[] = "

_OpenRed_的博客 2058

Jasper Report使用JSON数据源创建报表

最近在做一个项目小功能,表单结案要生成PDF报表。 起初,想用HTML模板(art-template模板引擎)编写,利用浏览器的打印功能保存成pdf文件下载。但是HTML编写好的模板,页码、页眉、页脚设置有坑,表单内容中的表格较多,表格不能设置跨页,导致跨页的表格内容与页眉重叠,没能解决这个问题。 于是,转战研究Jasper report生成报表,用更加专业的报表生成工具来做。刚开始,也是跌跌撞撞,遇到了很多问题,因为觉得没有退路了,必须要用这个搞出来,所以就硬着头皮去找各种资料。 主要使用的json

xiaogege2012的专栏 3319

Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 【数组 二分查找】

Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 【数组 二分查找】

Bitdancing的专栏 4004

ABAP CDS SELECT, parameters 全面解析:把参数化视图玩明白(含可运行示例)

这篇技术博客介绍了ABAP CDS中参数化视图的用法与实践。文章从业务需求出发,解释了参数化视图的必要性,并详细说明了语法规则、参数类型匹配、视图内部参数引用等关键点。重点展示了在JOIN和ASSOCIATION中传递参数的写法,提供了航线分析的完整业务案例和可运行代码示例。文章还总结了视图实体与DDIC视图的差异、会话变量使用技巧等实践要点,特别强调了JOIN中必须显式传参的语法要求。通过真实场景演示,帮助开发者掌握参数化CDS的高效应用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 362

099、多摄融合与变焦系统:广角到长焦的无缝切换算法

本文分享了多摄融合与变焦系统开发中的实战经验和关键挑战。作者通过一个旗舰机项目案例,揭示了广角到长焦切换时画面抖动问题的根源——融合算法误将视差当作运动补偿,并提出"视差冻结窗口"的解决方案。文章总结了三大多摄融合难点:物理视差处理、亮度差异补偿和切换时机把控,详细阐述了分层架构设计、融合权重计算等核心技术。同时强调了产线校准的重要性,并给出五项实用建议:允许边缘鬼影保留、参数场景化配置、加强产线检测、完善调试接口,以及合理运用AI技术。全文展现了多摄融合技术在时间、空间和感知维度上的复杂平衡艺术。

sundong_81的博客 45

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

这篇文章介绍了在排序数组中查找目标值起始和结束位置的二分查找算法。主要内容包括: 查找左边界时使用向下取整的中值计算,通过right=mid保留可能的左边界 查找右边界时使用向上取整的中值计算,通过left=mid保留可能的右边界 关键点说明:循环条件使用left<right避免死循环,查找左右边界时采用不同的中值计算方式 常见错误分析:展示了可能导致边界遗漏或死循环的错误写法 算法正确性验证:以[5,7,7,8,8,10]为例,详细演示了查找target=8的执行过程 比较了不同中值计算方式对算法性

2402_83315537的博客 1629

使用安卓的IMU数据进行 行人航位推算(PDR)推算步长 附python 代码

加速度计数据、陀螺仪数据、重力传感器数据、姿态仰角数据。数据分析与定位轨迹生成主要使用Python离线完成。示意图。

三维点云技术探索 1913

Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置

Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/   本质上就是一个二分查找问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #inc

珍惜 7775

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

leetcode力扣 34题 在排序数组中查找元素的第一个和最后一个位置

题目: 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums =[5,7,7,8,8,10], target = 6 输出: [-1,-1] 第一个出现的位置: 左边不是target右边是target。 最

LifeGoesOn 421

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

题目描述(中等难度) 找到目标值的第一次出现和最后一次出现的位置,同样要求 log ( n ) 下完成。 先分享 leetcode 提供的两个解法。 解法一 线性扫描 从左向右遍历,一旦出现等于 target 的值就结束,保存当前下标。如果从左到右没有找到 target,那么就直接返回 [ -1 , -1 ] 就可以了,因为从左到右没找到,那么从右到左也一定不会找到的。如果找到了,然后再从右到左...

wind_liang的博客 1275

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【力扣LeetCode】34 在排序数组中查找元素的第一个和最后一个位置

题目描述(难度中) 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8...

Jiewang的博客 247

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

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]输入:nums = [], target = 0。

m0_73841621的博客 671

【力扣】LeetCode34. 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 /** * Note: The returned array must be malloced, assume caller calls free(). */ int* se...

金金金金金的博客 225

LeetCode 34在排序数组中查找元素的第一个和最后一个位置

LeetCode 34在排序数组中查找元素的第一个和最后一个位置 题目简述:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1...

XBlog 250

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

题目要求在排序数组中查找目标值的起始和结束位置,若不存在则返回[-1, -1]。三种解法均基于二分查找找下界的思想:通过查找target的下界确定起始位置,查找target+1的下界确定结束位置。解法差异主要体现在循环条件和边界处理上:解法一使用经典二分循环条件l<=r,解法二改为l<r,解法三采用开区间处理l+1<r。三种方法的时间复杂度均为O(log n),解法二和解法三在边界处理上更简洁直观。

大家好,我是千楼,全栈开发工程师,分享日常学习和工作,记录成长~~~ 1082

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

有序数列很容易就想到使用二分查找,分两次查找,一次从左向右查找第一个值,一次从右向左找最后一个值。 class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { int len =nums.size(); if(len ==0) { return {-1,-1}; ..

weixin_43304992的博客 190

LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

LeetCode 34 在排序数组中查找元素的第一个和最后一个位置题目描述思路代码 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 思路 思路非常简单,就是单纯的二分查找,如果在数组中找到一个数和目标数相同,就在此位置向...

weixin_37905795的博客 219

golang力扣leetcode 34.在排序数组中查找元素的第一个和最后一个位置

34.在排序数组中查找元素的第一个和最后一个位置34.在排序数组中查找元素的第一个和最后一个位置题解代码 34.在排序数组中查找元素的第一个和最后一个位置 34.在排序数组中查找元素的第一个和最后一个位置 题解 思路: 1.go自带二分函数sort.SearchInts或者sort.Search 2.函数返回第一个等于target的下标,如果target不存在则返回第一个大于target数的下标 3.由于target可能不在数组中,所有需要对下标进行校验 代码 func searchRange(nums

清风 1068

【LeetCode 热题 100】34. 在排序数组中查找元素的第一个和最后一个位置——二分查找

问题要求在一个升序排序的数组。

最短的捷径就是绕远路,绕远路才是我的最短捷径。 1400

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

leetcode34在排序数组中查找元素的第一个和最后一个位置 要求:在排序数组中查找元素的第一个和最后一个位置 时间复杂度:olg(n) 解法:这个题可以用二分搜索来做,分别搜索出最左边的元素和最右边的元素 //在排序数组中查找元素的第一个位置和最后一个位置 public static int[] searchRange(int[] nums, int target) { ...

LiuRenyou的博客 511
上一篇: LeetCode-33 - 搜索旋转排序数组
下一篇: LeetCode-35 - 搜索插入位置
CodAlun
博客等级 码龄8年 46粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值