二分查找搜索左右边界.md
这一方法最主要的就是对于相等条件的处理,对于查找左边界,当相等时,将右边界缩小,对于查找右边界,当相等时,将左边界增大。
此外,要对边界进行处理,当左边界超出数组范围时,返回-1,当右边界超出数组范围时,返回-1。
对于下面闭区间的写法,结束条件不是l=r,所以判断是否等于target的时候,要分别判断l和r是否等于target。
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
def searchLeft(arr, target):
l = 0
r = len(arr) - 1
while l <= r:
mid = (l + r) // 2
if arr[mid] < target:
l = mid + 1
elif arr[mid] > target:
r = mid - 1
elif arr[mid] == target:
r = mid - 1
if l < 0 or l > len(arr) - 1:
return -1
return l if arr[l] == target else -1
def searchRight(arr, target):
l = 0
r = len(arr) - 1
while l <= r:
mid = (l + r) // 2
if arr[mid] < target:
l = mid + 1
elif arr[mid] > target:
r = mid - 1
elif arr[mid] == target:
l = mid + 1
if r < 0 or r > len(arr) - 1:
return -1
return r if arr[r] == target else -1
return [searchLeft(nums, target), searchRight(nums, target)]