算法思想:每次将待查找元素target与有序列表的中间元素nums[mid]相比较,若等于中间元素则返回中间元素的下标,若大于中间元素则在后半部分中查找,若小于中间元素则在前半部分中查找。若找不到则返回-1
二分查找又称折半查找,其只适用于在有序列表中查找。
时间复杂度O(logn),n为数组长度
空间复杂度O(1)
代码部分:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)-1
while(left <= right):
mid = (right - left) // 2 + left
if(target < nums[mid]):
right = mid-1
elif(target == nums[mid]):
return mid
else:
left = mid+1
return -1
这里解释一下为什么取中间值的时候用(right - left)//2 + left 而不是用(right + left)//2。
这两个式子是恒等式,但是计算机中两个int相加可能会溢出,利用先减再除 最后加 可以很大程度避免溢出问题。