本题解法照抄王尼玛的解答
思路:
1. 当一道题出现了 排序数组+搜索 或者 排序数组+log(n)的时候,我们的第一反应肯定是二分法
难点:
1. 用 log(n) 找到target没问题 ,关键是如何用log(n)找到其他两个端点。
关键操作:
1. 在用循环找到了target之后,不要返回该下标,继续二分查找端点下标,直到找到
1)边界 0 或 len(nums)-1
2) 左端点左边 != target 或者 右端点右边 != target
3) 一般二分法循环如下:
l = 0
r = len(nums)-1
while l <= r :
mid = l + (r-l)//2
if nums[ mid ] < target:
l = mid+1
elif nums[ mid ] > target:
r = mid -1
else:
return mid
代码:
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if not nums: return [-1,-1]
def get_points(direction):
l = 0
r = len(nums)-1
while l<=r:
mid = l + (r-l)//2
if nums[mid]>target:
r = mid-1
elif nums[mid]<target:
l = mid+1
else:
if direction == 'left':
if mid>0 and nums[mid] == nums[mid-1]:
r = mid-1
else:
return mid
else:
if mid<len(nums)-1 and nums[mid] == nums[mid+1]:
l = mid+1
else:
return mid
return -1
return [get_points('left'),get_points('right')]