(1)查找一个数
def search(nums, target):
left = 0
right = len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
return -1
(2)查找一个数的左侧区间
什么是左侧区间呢?
对于这个数组,算法会返回 1。1及其左侧都为左侧区间
方法一:
原则:num[left]<=target num[right]>target
target一定在下标区间 (left,right] 内
def search(nums, target):
left = 0
right = len(nums) - 1
while (right - left) > 1:
mid = (left + right) // 2
if nums[mid] < target:
left = mid
elif nums[mid] >= target:
right = mid
return right
方法二:
原则:num[right]>=target
下标left处的值在循环时可能位于target两侧,但最终必定会与下标right处的值一起逼近target。因此不考虑left实际上是否在target左侧,只要保证right最接近target即可。
def search(nums, target):
left = 0
right = len(nums) - 1
while right > left:
mid = (left + right) // 2
if nums[mid] < target:
left = mid + 1
elif nums[mid] >= target:
right = mid
return left
为什么right≠mid - 1?
注意!这里的原则是num[right]>=target,如果right=mid - 1,可能无法遵守原则。