这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件
两个坑
1.while(left < right) 还是 while(left <= right) 看右是否闭,例如,[1,1]是否合格
2.比较之后,right = middle呢,还是要right = middle - 1
主要还是看右闭还是右开
在左闭右闭的区间里,也就是[left, right]
#左闭右闭
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left=0
right=len(nums)-1
while left<=right:
middle=(left+right)//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, right = 0, len(nums) # 定义target在左闭右开的区间里,即:[left, right)
while left < right: # 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle # target 在左区间,在[left, middle)中
elif nums[middle] < target:
left = middle + 1 # target 在右区间,在[middle + 1, right)中
else:
return middle # 数组中找到目标值,直接返回下标
return -1 # 未找到目标值