news 2026/6/10 0:44:35

LeetCode 34:在排序数组中查找元素的第一个和最后一个位置(含思维过程)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 34:在排序数组中查找元素的第一个和最后一个位置(含思维过程)

题目链接:LeetCode 34 - Find First and Last Position of Element in Sorted Array。leetcode​
题目大意:给定一个按非递减顺序排序的整数数组 nums,和一个目标值 target,要求在数组中找到 target 出现的第一个位置和最后一个位置,返回 [start, end]。如果不存在,返回 [-1, -1],并且算法时间复杂度必须是 O(log⁡n)O(\log n)O(logn)。leetcode​

最朴素的想法:先找到一个,再往两边扫

一开始的直觉很自然:
先用二分查找找到某个 mid,使得 nums[mid] == target。
从 mid 向左扫,直到遇到第一个不等于 target 的位置,前一个就是 start。
从 mid 向右扫,直到遇到第一个不等于 target 的位置,前一个就是 end。
这个思路在正确性上没问题,但有一个明显的问题:
在极端情况下,比如 nums = [8,8,8,8,8,8],虽然找到一个 8 用了 O(log⁡n)O(\log n)O(logn),但是向左、向右的线性扫描又回到了 O(n)O(n)O(n)。
综合起来,最坏复杂度是 O(n)O(n)O(n),不满足题目要求的 O(log⁡n)O(\log n)O(logn)。
所以,向两边"线性扫"是不行的,必须连"找左右边界"这一步也用二分来做。

改进方向:用二分专门找"边界"

既然数组有序,而且要 O(log⁡n)O(\log n)O(logn),自然想到:
不仅要用二分找一个 target,
还要用"改造过的二分"去分别找最左和最右的 target。
这里有两个关键的小问题:
找左边界时,nums[mid] == target 时怎么办?
不能直接返回,因为左边可能还有 target。
正确做法是:记录当前 mid 是一个候选答案,然后把 right 收缩到 mid - 1,继续往左找。
找右边界是不是对称的?
是的,找右边界时,nums[mid] == target 时,记录答案,然后把 left 收缩到 mid + 1,继续往右找。
所以,思路变成:
写一个 find_start_position:
尽量往左压缩,找到"第一个等于 target 的位置"。
写一个 find_end_position:
尽量往右压缩,找到"最后一个等于 target 的位置"。
每个函数内部都是一次完整的二分,整体只做了常数次二分,复杂度是 2⋅log⁡n2 \cdot \log n2⋅logn,在大 O 记号下仍然是 O(log⁡n)O(\log n)O(logn),完全符合要求。enjoyalgorithms+1​

关于"2 次二分是不是超了 O(log n)?"

从渐进复杂度的角度,2⋅log⁡n2 \cdot \log n2⋅logn、3⋅log⁡n3 \cdot \log n3⋅logn 等都写作 O(log⁡n)O(\log n)O(logn),常数因子会被忽略。enjoyalgorithms​
实际上,很多官方题解和主流题解就是 “两次边界二分”:
第一次找左边界;
第二次找右边界;
这一点在面试中是完全没有问题的。

最终实现:两个边界二分函数

下面是用 C 写的完整代码,拆成三个函数:
find_start_position:找左边界。
find_end_position:找右边界。
searchRange:主函数,负责处理空数组、调用两个二分,并返回结果。
代码如下:

intfind_end_position(int*nums,intnumsSize,inttarget){intleft,right,mid,end_position;left=0;right=numsSize-1;end_position=-1;while(left<=right){mid=left+(right-left)/2;if(nums[mid]==target){end_position=mid;left=mid+1;}elseif(nums[mid]<target){left=mid+1;}else{// nums[mid] > targetright=mid-1;}}returnend_position;}intfind_start_position(int*nums,intnumsSize,inttarget){intleft,right,mid,start_position;left=0;right=numsSize-1;start_position=-1;while(left<=right){mid=left+(right-left)/2;if(nums[mid]==target){start_position=mid;right=mid-1;}elseif(nums[mid]<target){left=mid+1;}else{// nums[mid] > targetright=mid-1;}}returnstart_position;}/** * Note: The returned array must be malloced, assume caller calls free(). */int*searchRange(int*nums,intnumsSize,inttarget,int*returnSize){intstart_position,end_position;int*result;result=(int*)malloc(2*sizeof(int));if(!nums||!numsSize){result[0]=-1;result[1]=-1;*returnSize=2;returnresult;}start_position=find_start_position(nums,numsSize,target);end_position=find_end_position(nums,numsSize,target);result[0]=start_position;result[1]=end_position;*returnSize=2;returnresult;}

这份代码在 LeetCode 上可以通过所有用例,实际提交记录:
用例:88 / 88 全部通过。
运行时间:0 ms,击败 100% 提交。
内存使用:9.82 MB。leetcode​

小结:这道题教会了什么?

这道题的关键不在"会不会写二分",而在于:
能否把"找到一个 target"提升为"找到一段 target 的边界";
知道 边界二分的典型写法:命中 target 时不要停,而是继续压缩一端;
能清楚解释为什么"两次二分仍然是 O(log⁡n)O(\log n)O(logn)“;
通过自己一步步把"线性往两边扫"的想法改进为"左右边界都用二分”,是一个很典型的"从直觉解到最优解"的思考路径。
如果想把这个模式记牢,可以再去刷几道类似的"找第一次 / 最后一次出现位置"的题,尽量统一成一套"找左边界 / 右边界"的模板,会在面试里非常加分。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 10:25:18

EmotiVoice语音合成在元宇宙数字人中的核心地位分析

EmotiVoice语音合成在元宇宙数字人中的核心地位分析 在虚拟偶像直播中&#xff0c;观众突然收到一句温柔关切的“你还好吗&#xff1f;”——语气里带着恰到好处的担忧与停顿。这并非真人主播的即兴发挥&#xff0c;而是由数字人自动触发的情感化回应。这样的交互体验背后&…

作者头像 李华
网站建设 2026/6/8 0:39:19

为什么EmotiVoice适合用于虚拟主播的声音驱动?

为什么EmotiVoice适合用于虚拟主播的声音驱动&#xff1f; 在直播弹幕中一句“你听起来今天心情不错啊”&#xff0c;让屏幕里的虚拟偶像眨了眨眼&#xff0c;语调轻快地回应&#xff1a;“当然啦——因为见到你们啦&#xff01;”——这看似自然的互动背后&#xff0c;是一整套…

作者头像 李华
网站建设 2026/6/8 11:51:58

LobeChat教育版定制开发:适合师生互动的教学助手

LobeChat教育版定制开发&#xff1a;适合师生互动的教学助手 在一所普通中学的晚自习教室里&#xff0c;一个学生正皱着眉头翻看物理课本——“牛顿第一定律到底在生活中怎么体现&#xff1f;”他犹豫了一下&#xff0c;打开学校内网中的AI学习平台&#xff0c;输入问题。不到…

作者头像 李华
网站建设 2026/6/9 6:51:28

EmotiVoice在远程教学中的互动语音应用场景

EmotiVoice在远程教学中的互动语音应用场景 在一场线上物理课的直播中&#xff0c;AI助教用温和而清晰的声音讲解完牛顿第一定律后&#xff0c;突然语气一转&#xff1a;“这道题你错了三次——别急&#xff0c;我们再试一次。”语调里带着鼓励和耐心。学生听到的不是冰冷的电子…

作者头像 李华
网站建设 2026/6/7 13:31:47

EmotiVoice语音合成在数字人项目中的核心作用

EmotiVoice语音合成在数字人项目中的核心作用 在虚拟主播直播中突然“破防”落泪&#xff0c;或是在心理咨询对话中用温柔语调说出一句“我懂你的委屈”——这些让人心头一颤的瞬间&#xff0c;背后往往藏着一个关键角色&#xff1a;会“动情”的声音。当数字人不再只是机械复读…

作者头像 李华
网站建设 2026/6/4 23:14:59

5、量子计算与数据经济:原理、应用与挑战

量子计算与数据经济:原理、应用与挑战 1. 量子计算基础算法与原理 量子计算领域中,Shor和Grover算法为其奠定了基础,并明确了诸多实际应用场景。以Grover算法为例,其操作的核心是通过特定算子将振幅以平均值为基准进行翻转。该操作会使目标态(S_a)的振幅大幅增加,其幅值可…

作者头像 李华