def binarySearch(nums, target):
left, right = 0, len(nums) - 1 # 左右边界,闭区间
# 搜索区间为 [left, right]
while left <= right: # 小于等于,结束条件为:left = right + 1
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
if nums[mid] > target:
right = mid - 1 # 搜索区间变为 [left, mid - 1]
else:
left = mid + 1 # 搜索区间变为 [mid + 1, right]
return -1
搜索左边界返回 left,有可能超出数组的右边界。
def binarySearchLeft(nums, target):
left, right = 0, len(nums) - 1 # 左右边界,闭区间
# 搜索区间为 [left, right]
while left <= right: # 小于等于,结束条件为:left = right + 1
mid = left + (right - left) // 2
if nums[mid] == target:
right = mid - 1 # 重点,收缩右边界
elif nums[mid] > target: # 可以合并为 >=
right = mid - 1 # 搜索区间变为 [left, mid - 1]
else:
left = mid + 1 # 搜索区间变为 [mid + 1, right]
# 判断 target 是否存在于 nums 中
if left == len(nums): # 此时 target 比所有数都大,返回 -1
return -1
return left if nums[left] == target else -1 # 判断一下 nums[left] 是不是 target
搜索右边界返回right,有可能超出数组的左边界。
def binarySearchRight(nums, target):
left, right = 0, len(nums) - 1 # 左右边界,闭区间
# 搜索区间为 [left, right]
while left <= right: # 小于等于,结束条件为:left = right + 1
mid = left + (right - left) // 2
if nums[mid] == target:
left = mid + 1 # 重点,收缩左边界
elif nums[mid] < target: # 可以合并为 <=
left = mid + 1 # 搜索区间变为 [mid + 1, right]
else:
right = mid - 1 # 搜索区间变为 [left, mid - 1]
# 判断 target 是否存在于 nums 中
if right == -1: # 此时 target 比所有数都小,返回 -1
return -1
return right if nums[right] == target else -1 # 判断一下 nums[right] 是不是 target