news 2026/3/31 22:41:55

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/3/28 11:20:51

EmotiVoice语音合成错误排查手册:常见问题与解决

EmotiVoice语音合成错误排查手册&#xff1a;常见问题与解决 在智能语音技术飞速发展的今天&#xff0c;用户对“机器说话”的期待早已超越了基本的可听性——他们希望听到的是有情绪、有个性、像真人一样的声音。传统的文本转语音&#xff08;TTS&#xff09;系统虽然稳定&…

作者头像 李华
网站建设 2026/3/28 10:18:52

LobeChat行业解决方案合集:金融、教育、医疗等场景适配

LobeChat 行业解决方案&#xff1a;金融、教育、医疗等场景的智能对话落地实践 在企业数字化转型加速推进的今天&#xff0c;AI助手早已不再是“锦上添花”的概念玩具。从银行客服到医院门诊&#xff0c;从课堂辅导到法律咨询&#xff0c;越来越多的专业场景开始依赖自然语言交…

作者头像 李华
网站建设 2026/3/27 22:53:45

EmotiVoice能否用于生成讽刺或幽默语气?语言风格挑战

EmotiVoice能否生成讽刺或幽默语气&#xff1f;一场关于语言风格的深度探索 在虚拟主播用一句拖长尾音的“哇哦&#xff5e;真是个‘完美’的安排呢”引发弹幕爆笑时&#xff0c;你有没有想过&#xff1a;这句充满微妙反讽的语音&#xff0c;真的是AI凭空“理解”出来的吗&…

作者头像 李华
网站建设 2026/3/28 6:15:45

EmotiVoice语音断点续合技术实现方法研究

EmotiVoice语音断点续合技术实现方法研究 在长文本语音合成和实时交互系统日益普及的今天&#xff0c;用户对语音生成的连贯性、稳定性和个性化提出了前所未有的高要求。想象这样一个场景&#xff1a;一位视障用户正在通过TTS系统聆听一本30万字的小说&#xff0c;读到第15章时…

作者头像 李华
网站建设 2026/3/28 4:44:12

EmotiVoice在儿童故事机产品中的实际应用案例

EmotiVoice在儿童故事机产品中的实际应用案例 在智能教育硬件日益普及的今天&#xff0c;越来越多的家庭开始使用儿童故事机作为孩子睡前陪伴、语言启蒙和情感交流的重要工具。然而&#xff0c;许多用户反馈&#xff1a;机器朗读的声音“太机械”“没有感情”&#xff0c;孩子听…

作者头像 李华
网站建设 2026/3/30 9:45:48

零样本声音克隆技术揭秘:EmotiVoice是如何做到的?

零样本声音克隆技术揭秘&#xff1a;EmotiVoice是如何做到的&#xff1f; 在虚拟偶像直播中突然切换语气&#xff0c;在游戏NPC对话里听出愤怒或悲伤&#xff0c;在语音助手中感受到“关心”的语调——这些曾经只属于人类交流的细腻表达&#xff0c;正被AI语音合成悄然复现。而…

作者头像 李华