1. 思路
给你一本1000页的书籍,如何用最快的方式找到随机给定的一个页码?
步骤1:设定一个页码作为中心点来将1000页分为两份,中位数的作用就是每次缩小一半查找范围,即达到开方的效果。即可以用 (首位+末位)/2 = 中位数。
步骤2:将需要查找的页码与中位数比价,如果大于中位数则舍弃对中位数的前一半查找,反之则舍弃对后一半范围查找,达成开方效果。
步骤3:重复步骤1
步骤4:重复步骤2
………………
直到首位索引=末尾索引,就找到了随机给定的一个页码
2. 实战
class Solution:
def search(self, nums: list[int], target:int)->int:
left, right = 0, len(nums) - 1 # 定义target在左闭右闭的区间里,[left, right]
while left <= right:
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle - 1 # target在左区间,所以[left, middle - 1]
elif nums[middle] < target:
left = middle + 1 # target在右区间,所以[middle + 1, right]
else:
return middle # # 数组中找到目标值,直接返回下标
return -1
if __name__ == '__main__':
solution = Solution() # 第一步类实例化
print(solution.search([1,2,3,5,9], 9))
执行的结果:
4
3. 总结
从1个没有重复元素的列表中 查找1个元素,用二分法非常高效。