34. 在排序数组中查找元素的第一个和最后一个位置
题目描述
解题思路
本质是查找有序数组中目标值的左右边界。左右边界的查找参考东哥详解。
代码实现
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
res = [-1, -1]
if not nums:
return res
# find left index
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if target < nums[mid]:
right = mid - 1
elif target > nums[mid]:
left = mid + 1
elif target == nums[mid]:
right = mid - 1
# 要计算target != nums[left], nums[left]有可能越界,因此需要先进行越界判断
if left >= len(nums) or target != nums[left]:
pass
else:
res[0] = left
# find right index
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if target > nums[mid]:
left = mid + 1
elif target < nums[mid]:
right = mid -1
elif target == nums[mid]:
left = mid + 1
# 要计算target != nums[right], nums[right]有可能越界,因此需要先进行越界判断
if right < 0 or target != nums[right]:
pass
else:
res[1] = right
return res