在二分查找解决的问题中最核心的就是需要根据具体的问题来确定循环的判断条件是否需要取等号,并且最终返回的是l还是r。二分查找中最常见的是查找第一个大于等于x的位置,当发现当前的x大于列表中最后一个元素那么返回列表长度即可。我们可以记住其中的模板,在用到的时候可以直接写出来:
from typing import List
def binarySearch(nums: List[int], x: int):
l, r = 0, len(nums) - 1
# 如果大于列表的最后一个元素那么直接返回列表长度即可
if x > nums[r]: return r + 1
while l < r:
mid = l + r >> 1
if nums[mid] >= x:
r = mid
else:
l = mid + 1
return l
if __name__ == '__main__':
nums = [1, 2, 4, 8]
print(binarySearch(nums, 3))