写二分法,区间的定义一般为两种,闭区间或者开区间
(1)左闭右闭区间
while(left<=right)
要使用<=
,因为left==right
是有意义的,所以使用<=
if (nums[middle] > target)
,right
要赋值为middle - 1
,因为当前这个nums[middle]
一定不是target
,那么接下来要查找的左区间结束下标位置就是middle - 1
,反之同理。
class Solution: | |
def search(self, nums: List[int], target: int) -> int: | |
left, right = 0, len(nums) - 1 | |
while left <= right: | |
middle = (left + right) // 2 | |
if nums[middle] < target: | |
left = middle + 1 | |
elif nums[middle] > target: | |
right = middle - 1 | |
else: | |
return middle | |
return -1 |
(2)左闭右开区间
while(left<right)
要使用<
,因为left==right
是没有意义的,所以使用<
if (nums[middle] > target)
,right
要赋值为middle
,因为当前nums[middle]
不等于target
,去左区间继续寻找,而寻找区间是左闭右开区间,所以right
更新为middle
,即:下一个查询区间不会去比较nums[middle]
class Solution: | |
def search(self, nums: List[int], target: int) -> int: | |
left,right =0, len(nums) | |
while left < right: | |
mid = (left + right) // 2 | |
if nums[mid] < target: | |
left = mid+1 | |
elif nums[mid] > target: | |
right = mid | |
else: | |
return mid | |
return -1 |