LeetCode刷题实战34:在排序数组中查找元素的第一个和最后一个位置
共 2357字,需浏览 5分钟
·
2020-09-10 15:31
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从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].
题意
样例
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
题解
target
的,但是找到的target
不知道是最左边的数还是最右边的数,所以,通过找到这个数再找出相应的边界值.target
在最左边的位置,在求出另一个边界!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;
}
}
bisect.bisect_left(a,x,lo=0,hi=len(a))
在a
中找x
最左边数的索引,如果找不到就返回插入的索引.上期推文: