题目
在排序数组中查找元素的第一个和最后一个位置
思路
很明显的二分法,求左边界值其实就是常规的求确切值问题(找到有序素组中为
target
的元素),不同之处在于,此题中 不是递增序列,而是单调不递减序列,这就意味着可能存在一个区间的值都是等于target
的,而题目要求的就是求这个可能区间的边界下标。 求左边界很容易,按照套路求解就行。而右边界则稍稍有点不同,但是大体一致,只是比较条件跟求左边界相反,需要注意的求出的结果最终要-1,具体原因是因为是向下取整的,能否想明白这点?
代码
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if not nums:
return -1,-1
# 求左边界值
left = 0
n = len(nums)
right = n
while left < right:
mid = (left+right) // 2
if nums[mid] < target:
left = mid + 1
else:
right = mid
r1 = left
if r1 >= n or nums[r1] != target:
return -1, -1
# 求右边界值
left = 0
right = n
while left < right:
mid = (left+right) // 2
if nums[mid] > target:
right = mid
else:
left = mid + 1
r2 = right - 1
return r1,r2