news 2026/8/1 5:00:43

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leetcode34题 在排序数组中查找元素的第一个和最后一个位置

目录

  • 34. 在排序数组中查找元素的第一个和最后一个位置
    • 题目描述
    • 思路
      • 核心思想
      • 关键点
    • 代码
      • 解法一:闭区间[l, r]
      • 解法二:左闭右开[l, r)
      • 解法三:开区间(l, r)
    • 答疑
      • Q: 闭区间写法中,nums[mid] >= target时为什么是r = mid - 1?mid不可能是答案吗?不会错过正确答案吗?
    • 复杂度分析

题号: “34”
难度: 中等
标签: 二分查找,数组
链接: https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/

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

题目描述

给定一个升序排列的整数数组nums和一个目标值target,找出target在数组中的第一个最后一个位置;若数组中不存在target,返回[-1, -1]

  • 输入:nums(升序数组,可能含重复元素)、target
  • 输出:[start, end](下标),不存在时返回[-1, -1]
  • 进阶: 要求时间复杂度为 O(log n)

思路

核心思想

两次二分,分别定位左边界与右边界:

  • 左边界=lowerBound(nums, target):第一个>= target的下标
  • 右边界=lowerBound(nums, target + 1) - 1:即「第一个> target的位置」再往前一位,得到最后一个<= target的下标

start == nnums[start] != target,说明目标不存在,返回[-1, -1];否则返回[start, end](起点存在时,终点必然存在)。

关键点

完整的需求转化表见 [[二分查找模板]],本题只需用到其中两行:

需求写法不存在时
第一个>= x的下标lowerBound(nums, x)n
最后一个<= x的下标lowerBound(nums, x + 1) - 1-1

两次二分相互独立,各 O(log n),总复杂度 O(log n)。

代码

三种区间写法的lowerBound行为完全一致,searchRange主逻辑共用。默认推荐左闭右开(与 C++ STLlower_bound语义一致)。

解法一:闭区间[l, r]

classSolution{public:intlowerBound(vector<int>&nums,inttarget){intl=0,r=nums.size()-1;while(l<=r){intmid=l+(r-l)/2;// 防止溢出if(nums[mid]>=target)r=mid-1;// 答案至多为 mid,收缩右边界elsel=mid+1;}returnl;// 或 r + 1}vector<int>searchRange(vector<int>&nums,inttarget){intstart=lowerBound(nums,target);if(start==nums.size()||nums[start]!=target)return{-1,-1};// 起点不存在,终点必然不存在intend=lowerBound(nums,target+1)-1;return{start,end};}};

解法二:左闭右开[l, r)

classSolution{public:intlowerBound(vector<int>&nums,inttarget){intl=0,r=nums.size();// 区间 [0, n),r 取 n 可表示越界while(l<r){intmid=l+(r-l)/2;if(nums[mid]>=target)r=mid;// 答案在 [l, mid] 内,保留 midelsel=mid+1;}returnl;// 或 r}vector<int>searchRange(vector<int>&nums,inttarget){intstart=lowerBound(nums,target);if(start==nums.size()||nums[start]!=target)return{-1,-1};intend=lowerBound(nums,target+1)-1;return{start,end};}};

解法三:开区间(l, r)

classSolution{public:intlowerBound(vector<int>&nums,inttarget){intl=-1,r=nums.size();// 区间 (-1, n),哨兵可表示边界while(l+1<r){intmid=l+(r-l)/2;// 循环保证 r - l >= 2,mid 必在区间内if(nums[mid]>=target)r=mid;elsel=mid;}returnr;// 或 l + 1}vector<int>searchRange(vector<int>&nums,inttarget){intstart=lowerBound(nums,target);if(start==nums.size()||nums[start]!=target)return{-1,-1};intend=lowerBound(nums,target+1)-1;return{start,end};}};

答疑

Q: 闭区间写法中,nums[mid] >= target时为什么是r = mid - 1?mid不可能是答案吗?不会错过正确答案吗?

关键在于区分二分范围答案所在范围

lowerBound维护的循环不变量是:答案(第一个>= target的位置)始终落在[l, r + 1]。当nums[mid] >= target时,mid已经满足条件,而答案必须是「第一个」满足条件的位置,所以答案至多为mid——mid右侧全部排除,二分范围收缩为[l, mid - 1],而可能答案mid由边界r + 1携带,不会被丢弃。

同理,若target大于区间内所有元素,循环结束时l == r + 1,答案正是l二分收缩的是候选区间,答案由边界l/r携带,永不丢失。其余两种写法同理:左闭右开由r携带,开区间由r(或l + 1)携带。

复杂度分析

时间复杂度空间复杂度说明
O(log n)O(1)两次二分各 O(log n);原地操作,无额外空间
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 4:55:27

158、TinyML模型训练最佳实践:持续学习

TinyML模型训练最佳实践:持续学习 昨晚调试一块STM32U5上的手势识别模型,发现部署三周后准确率从92%掉到了78%。用户新增了几个自定义手势,模型开始把“滑动”误判成“点击”。这不是过拟合,是典型的“灾难性遗忘”——新知识覆盖了旧知识,而TinyML设备又不能像云端那样随…

作者头像 李华
网站建设 2026/8/1 4:49:37

Java浮点数精度处理:BigDecimal、DecimalFormat等5种保留小数方法详解

1. 从一次线上事故说起&#xff1a;为什么“保留小数”不是小事前几天&#xff0c;团队里一个刚上线的服务出了个不大不小的线上问题。一个核心的计费模块&#xff0c;在计算用户的服务费用时&#xff0c;本该输出125.50元&#xff0c;结果页面上赫然显示着125.49999999999999。…

作者头像 李华
网站建设 2026/8/1 4:49:00

UniApp混合开发:自定义Application与Activity实现双击返回键退出

1. 项目概述&#xff1a;当UniApp遇上原生安卓 最近在做一个混合开发的项目&#xff0c;核心框架是UniApp&#xff0c;但客户要求在App里集成一些特定的原生功能&#xff0c;比如一个需要常驻后台的蓝牙服务&#xff0c;以及一个自定义的启动屏动画。这就引出了一个典型场景&am…

作者头像 李华
网站建设 2026/8/1 4:48:03

AI写论文靠谱吗?2026年学长实测的正确打开方式

「AI写论文」这个词在2026年的搜索量比三年前翻了十几倍&#xff0c;但学生的态度依然分裂&#xff1a;有人全靠AI一周搞定初稿&#xff0c;有人闻AI色变、碰都不敢碰。真相在中间&#xff1a;AI写论文靠不靠谱&#xff0c;不取决于工具&#xff0c;而取决于你怎么用。用错了是…

作者头像 李华
网站建设 2026/8/1 4:46:00

嵌入式调试核心指南:JTAG/SWD协议与J-Link/ST-Link调试器选型实战

1. 项目概述&#xff1a;从“黑盒”到“白盒”的桥梁搞嵌入式开发&#xff0c;特别是单片机、ARM Cortex-M这类芯片&#xff0c;最怕的就是程序跑飞了或者逻辑卡死。板子一上电&#xff0c;灯不亮、串口没反应&#xff0c;这时候如果只能靠猜、靠重新烧录碰运气&#xff0c;那效…

作者头像 李华
网站建设 2026/8/1 4:44:25

MLP国配第一季翻译问题分析:文化差异与本地化策略

这次我们来看一个很有意思的话题——MLP国配第一季中的翻译问题。作为一部在全球拥有大量粉丝的动画作品&#xff0c;《My Little Pony》的国语配音版在本地化过程中出现了一些让观众"摸不着头脑"的翻译处理。这些翻译不仅影响了观看体验&#xff0c;更反映了本地化工…

作者头像 李华