> 技术文档 > 面试150 在排序数组中查找元素的第一个和最后一个元素

面试150 在排序数组中查找元素的第一个和最后一个元素

面试150 在排序数组中查找元素的第一个和最后一个元素

思路1

直接搜寻法,通过记录target所对应的索引值,最后返回第一个和最后一个下标即可。

class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: if target not in nums: return [-1,-1] res=[] for i in range(len(nums)): if nums[i]==target: res.append(i) return [res[0],res[-1]]

思路2

通过两次二分查找定位目标值 target 的起始和结束位置。首先,如果 target 不在数组中,直接返回 [-1, -1]。否则,定义一个 binary 函数,用于查找第一个大于等于目标值的位置。第一次调用 binary(0, n-1, target) 找到 target 出现的最左位置 Left,第二次调用 binary(0, n-1, target+1) - 1 找到 target 出现的最右位置 Right。由于第二次查找的是 target+1,减一后刚好落在最后一个 target 上。最后检查边界条件并返回 [Left, Right]。

class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: if target not in nums: return [-1,-1] def binary(left,right,target): while left<=right: middle=(left+right)//2 if nums[middle]<target:  left=middle+1 elif nums[middle]>=target:  right=middle-1 return left n=len(nums) Left=binary(0,n-1,target) Right=binary(0,n-1,target+1)-1 if Left==n and nums[Left]!=nums[Right]: return [-1,-1] return [Left,Right]