写二分法,区间的定义一般为两种,闭区间或者开区间
(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 |