算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做在排序数组中查找元素的第一个和最后一个位置,我们先来看题面:
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value. Your algorithm's runtime complexity must be in the order of O(log n). If the target is not found in the array, return [-1, -1].
给定一个按照升序排列的整数数组 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]
思路1:手动二分法!
这里提供两种方法,一种容易理解,一种万能公式!
版本1:是指在二分法进行时,就判读是否有等于target
的,但是找到的target
不知道是最左边的数还是最右边的数,所以,通过找到这个数再找出相应的边界值.
版本2:是指二分法执行完毕,返回target
在最左边的位置,在求出另一个边界!
关于详细说明,请看这篇[二分搜索](二分查找有几种写法?它们的区别是什么?- Jason Li的回答 - 知乎 https://www.zhihu.com/question/36132386/answer/530313852),读完之后,可以加深二分搜索的理解!
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = {-1, -1};
int n = nums.length;
if (n == 0) return res;
int left = 0;
int right = n-1;
while (left <= right){
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
left = mid;
right = mid;
while (left > 0 && nums[left] == nums[left-1]) left--;
while (right < n - 1 && nums[right] == nums[right+1]) right++;
res[0] = left;
res[1] = right;
return res;
}
else if (nums[mid] > target) right = mid - 1;
else left = mid + 1;
}
return res;
}
}
思路2:库函数
python 的 bisect库
简要介绍一下,
bisect.bisect_left(a,x,lo=0,hi=len(a))
在a
中找x
最左边数的索引,如果找不到就返回插入的索引.
bisect.bisect(a, x, lo=0, hi=len(a)) 找最右边的!
思路3:
分而治之,参考链接:https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/discuss/14707/9-11-lines-O(log-n)
当然上面的时间复杂度都是:O(logn)
本文有点参考于
https://www.cnblogs.com/powercai/p/10826397.html
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。
上期推文:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有