给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n)
的算法。
二分法解决,先上代码,楼下细嗦。
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)
while left < right:
mid = left + (right - left) // 2
if nums[mid] < target:
left = mid + 1
else:
right = mid
return left
二分法编程问题统一使用 左闭右开。数组长度固定为[0, len(nums)),在代码上对应:
left, right = 0, len(nums)
因为左闭, 所以循环中左区间为 left = mid+1。因为右开,right = mi
这样写循环控制的另外一个好处就是在退出循环时, 必然满足 left == right,这样在最后的返回值就可以直接返回 left 了,不用去纠结该返回哪个端点了。
中间值的写法
写法为 mid = left + (right - left)//2 ,这样写的好处也非常简单,就是为了防止大数溢出,因为写成(left + right)//2时,当数比较大时,left + right是有溢出的风险的,这种写法就可以避免了。