【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:564|阅读时长:2分钟|浏览量:
题目浅析
想查看原题可以点击题目链接。
简单地说,就是给一个不降序数组和一个目标值 target,求数组中这个 target 值的下标区间,若无则返回{-1,-1}。
思路分享
二分查找的开始,虽然算法早就学过,但灵神的讲解十分透彻,十分值得学习。
下面的二分,都以如果中间量小于目标量左指针动,否则右指针动的情况,这样会求得二分值的最左处。
二分的灵魂在于循环不变量,即在循环中不变的东西,比如,左右指针的区间含义是闭区间,左闭右开,亦或开区间就很重要;还有循环结束后左右指针的位置也是,拿左闭右开举例,结束后,左右指针都处于target值最左处下标,因为左指针保持了 left-1 处必定小于 target,而右指针则保持了 right 处必定大于等于 target。
此外要记得溢出的处理问题,除 python 外,求二分的中间下标如果用
(left+right)/2的写法可能会溢出,所以要改写为left+(right-left)/2这样就减少了大于阈值的可能。那么目标值的右侧下标怎么求呢?回顾上面左指针的定义,可以保持 left-1 处必定小于 target,那么如果求得 target+1 的左指针位置,那么该位置减一就是 target 的右边界嘛。即使 target+1 这个值不存在,也不妨碍找到这个位置。
代码解答(强烈建议自行解答后再看)
- 参考题解
1 | class Solution { |
文章作者: 陆爻齐-LuYaoQi
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuYaoQi's Blogs!
相关推荐

2025-07-27
【Leetcode Daily】1011在D天内送达包裹的能力
题目浅析 想查看原题可以点击题目链接。 思路分享 二分答案的基本思路可看【Leetcode Daily】1283使结果不超过阈值的最小除数。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415161718192021222324252627282930class Solution: def shipWithinDays(self, weights: List[int], days: int) -> int: # 先要定好二分答案的左右区间起始,注意这是开区间 left, right = max(weights)-1, 500*len(weights)+1 def check(weights: List[int], ship_load: int, days: int) -> bool: # 此处把负载过小的情况快速地排除,加速 if sum(weights) > ship_load*days: ...

2025-06-05
【Leetcode Daily】1170比较字符串最小字母出现频次
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给两个字符串数组,看一个数组中各个字符串的最小字母频次,在另一个数组所有字符串的最小字母频次中,排第几。 思路分享 分别对两个数组做转换成最小字母频次的整型数组,然后让一个数组的各值在另一个数组做二分查找找到自己的位置即可。 二分的基本思想在 【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。 重点注意一个小问题,字典序的顺序与数字不同,字典序中 2 比 10 大,因为 2 大于 10 的第一位 1,所以 2 更大。正因如此,不能在 string 的数组上直接排序。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415161718192021222324252627282930class Solution {public: vector<int> numSmallerByFrequency(vector<string>& queries, vector<string>&...

2025-07-24
【Leetcode Daily】1283使结果不超过阈值的最小除数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个数组和一个阈值,现在找到一个尽可能大的数值 n,使得数组的每个值除 n 后之和小于阈值。 思路分享 二分的基本思路可看【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。 本题属于二分答案中的求最小系列,二分的思路是:既然求最小,那就是区间右侧满足条件,但左侧不满足,然后一点点逼近。 https://leetcode.cn/problems/find-the-smallest-divisor-given-a-threshold/solutions/2989469/mo-ban-er-fen-da-an-qiu-zui-xiao-pythonj-ukwe/ 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112class Solution: def smallestDivisor(self, nums: List[int], threshold: int) -> int: left, right = 0, max(nums) ...

2025-06-03
【Leetcode Daily】1385两个数组间的距离值
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给两个数组,求一个数组在另一数组不满足与其中一个值的一定区间内的元素数量。 思路分享 如何实现二分可看【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。 重点在于深刻理解二分的含义,比如上面样例的二分返回的下标的含义,其实是第一个大于目标值的下标,在这个基础上,如何该值同时已经超过目标值的区间,就说明满足题意。 https://leetcode.cn/problems/find-the-distance-value-between-two-arrays/solutions/3010185/liang-chong-fang-fa-er-fen-cha-zhao-san-15u9b/ 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415161718192021222324252627class Solution {public: int lowerBound(vector<int> &nums, int...

2025-12-23
【Leetcode Daily】2054两个最好的不重叠活动
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一系列活动的开始时间、结束时间和价值,其中最多能参加两个时间不重合的活动,求可获得价值最大值。 思路分享 本来是想通过 dp 解决,毕竟和 01 背包有点像,但没考虑清楚怎么方便地判断当前的活动是否能合法的插入,只好放弃。 灵神提供了针对本题只选取两活动的方法,只要贪心地记录较大价值的活动,然后在假设有当前活动的同时,找当前活动的开始时间前有无结束时间合适的活动取值就行。由于只有新活动的价值更大才会放进栈,所以能确保找到的最合适的那个价值一定最大(二分查找辅助查找) https://leetcode.cn/problems/two-best-non-overlapping-events/solutions/1075386/yong-you-xian-dui-lie-wei-hu-ling-yi-ge-8ld3x/?envType=daily-question&envId=2025-12-23 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112class Solution:...

2025-07-23
【Leetcode Daily】2070每一个查询的最大美丽值
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个二位整数数组来代表一个商品的价格和美丽值,然后根据一系列价格,查询不高于该数值能得到的最大美丽值。 思路分享 二分的基本思路可看【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。 本题有好几个思路,下面的参考题解选取采用预处理 item 和 二分 的方法。 https://leetcode.cn/problems/most-beautiful-item-for-each-query/solutions/1100468/jiang-xun-wen-chi-xian-pai-xu-by-endless-o5j0/ 重点是预处理,将商品们按价格升序排列后,再只保留相同价格中的最大美丽值,这样就方便了后续的二分,同时也减少了复杂性。 至于二分,需要牢记的是二分取左右的含义,本题二分的是目标值加一的取右,所以如果这个值取到了 0,说明目标不存在,也就是不符合条件了。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415class...
公告
希望你我都能得偿所愿
PS:相对流水账的文章只能在归档找得到
系列文章
