这是力扣的原题,我参考的是代码随想录的讲解视频代码随想录 (programmercarl.com)。自己可以去看看
思路:
这里是给定一个数组,然后在给定一个target,让在数组中来查找target,返回的是target所在数组的下标。
第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] (这个很重要非常重要)。
区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:
- while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
n = list(map(int, input().split()))
target = int(input())
left = 0
right = len(n) - 1
while left <= right:
mid = (left + right) // 2
if n[mid] == target:
print(mid)
break
elif n[mid] < target:
left = mid + 1
else:
right = mid - 1
else:
print(-1) # 找不到目标时输出-1
这是代码实现,其中要注意的是区间的闭合,是左闭右开还是左开右闭,这两种情况,对于mod的更新有着至关重要的影响。