1.什么是二分法
我们应该都玩过或者听说过一个游戏,猜数字。A在纸上写下一个0-100的数字,然后由其他人猜测这个数字是多少,猜数字的人报出数字后A会给出大了或者小了的提示。一般猜测者会报出50,依次缩小区间到0-50,0-25,12-25,12-18。这就是二分法的基本概念,在【大量】的【有序】且【不重复】的数据中查找目标值。
2.核心要点
(1)前置条件满足有序不重复数组
边界条件要搞清楚,做到能保证取到值且所有数字都能被遍历到。
(2)能保证取到值:
比如[1,1]可以取到数值“1”,[1,1)就是没有意义的区间,如果我们选择了[left,right]是闭区间,判断条件while left<=right 的“=”是可以取到值的。如果是[left,right)左闭右开,判断条件while left<=right 的“=”是没有意义的。
(3)保证所有数字被遍历到:
如果选择左闭右闭,midlle值大于target时,右边界更新为middle的前一个
如果选择左闭右开,midlle值大于target时,右边界更新为middle
3.相关题目
leetcode704就是一道使用二分法的题目:
方法一:左闭右闭
class Solution:
def search(self, nums: List[int], target: int) -> int:
left=0
right=len(nums)-1
while left<=right:
middle=left+(right-left)//2
if nums[middle]>target:
right=middle-1
elif nums[middle]<target:
left=middle+1
else:
return middle
return -1
方法二:左闭右开
class Solution:
def search(self, nums: List[int], target: int) -> int:
left=0
right=len(nums)
while left<right:
middle=left+(right-left)//2
if nums[middle]>target:
right=middle
elif nums[middle]<target:
left=middle+1
else:
return middle
return -1