二分查处的进阶,找到最左边和最右边的位置。
实现起来一点不难,可能当时状态不好。
其实需要关注的是一些特色情况处理,比如在findLeft的while循环结束后,需要判断nums[left]是否等于target,因为target可能不在nums中,而以往二分查找时,找到元素时,都是在循环内返回。
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if not nums:
return [-1, -1]
left = self.findLeft(nums, target)
if left == -1:
return [-1, -1]
right = self.findRight(nums, target)
return [left, right]
def findLeft(self, nums, target):
i = 0
j = len(nums)-1
while i < j:
m = (i+j) // 2
if nums[m] < target:
i = m+1
elif nums[m] == target:
j = m
else:
j = m-1
if nums[i] != target:
return -1
return i
def findRight(self, nums, target):
i = 0
j = len(nums)-1
while i < j:
m = (i+j+1) // 2
if nums[m] < target:
i = m+1
elif nums[m] == target:
i = m
else:
j = m-1
return i