在排序数组中查找元素的第一个和最后一个位置
题目描述:
给定一个按照升序排列的整数数组 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]
解题思路:
主要是利用二分查找法来解题
-
首先判断一下数组是否为空和比较
target
和升序数组的首位数字的大小,如果不满足题目要求,则返回[-1,-1]
-
然后通过二分查找法找到数组中第一个
target
值的位置,当找到相等的值时,把左右指针合并并分别向左向右依次遍历找出上下限,然后返回 -
如果不存在,则同样返回
[-1,-1]
Python源码:
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if len(nums) == 0:
return [-1, -1]
elif target < nums[0] or target > nums[-1]:
return [-1, -1]
else:
l, r = 0, len(nums) - 1
while l <= r:
mid = (l + r) // 2
if target > nums[mid]:
l = mid + 1
elif target < nums[mid]:
r = mid - 1
# 当找到相等的值时,把左右指针合并并分别向左向右依次遍历找出上下限
elif target == nums[mid]:
l = r = mid
while l - 1 >= 0 and nums[l - 1] == target:
l -= 1
while r + 1 <= len(nums) - 1 and nums[r + 1] == target:
r += 1
return [l, r]
return [-1, -1]
欢迎关注我的github:https://github.com/UESTCYangHR