相关题目
二分法
二分法这东西,就是一就会,一写就废,那么我们就来总结一下吧。
前提:有序数组
查询一个点(假设我们要查找的数据只出现一次)
leetcode:704
先left, right = 0, len(nums)-1都不用说了吧,将两个指针放在数组的首尾,然后每一次计算mid,并根据mid的值,来判断我们的目标点的位置。
我们先假设一下,如果是升序数组,我们的mid比目标要小,
那么目标一定在mid的右边,此时数组已经分成了[0, mid-1]和[mid+1, len(nums)-1]这两个区域,我们只需要看后面一半;
如果刚好是mid,直接返回;
另一半区间也同理。
不断划分下去,我们就能找到一个个合适的mid,判断是否为要找的点,直到left>right。
class Solution:
def search(self, nums: List[int], target: int) -> int:
l, r = 0, len(nums)-1
while l <= r:
mid = (l+r)>>1
if nums[mid] == target:
return mid
elif nums[mid] > target:
r = mid-1
else:
l = mid+1
return -1
不过我还是喜欢另外一个表达方式,那就是虚拟右顶点。(名字是我起的,这不重要)
我们将right设为len(nums),也就是实际right的右边位置,所以我们需要修改right的赋值和while的判断条件
class Solution:
def search(self, nums: List[