二分查找 python
缺失数字
http://www.nowcoder.com/questionTerminal/9ce534c8132b4e189fd3130519420cde
因为缺失了 一个数字 所以 下标指向数组的值 一定是 大于或者等于 当前 下标的
所有采用 二分的方法 逐个的去逼近 缺失的值
无非就是两种情况
第一种:下标指向的值 等于 当前的下标,那么 缺失的肯定是在当前下标的右侧,所以left=mid+1
第二钟:下标指向的值 大于 当前的下标,那么 缺失的肯定是在mid的左侧,所以right=mid
最后逼近到 left = mid + 1的时候 mid的左侧都是不确实的,mid+1就正好是缺失的值
并且此时 left == right 所以跳出循环 返回正确的答案
class Solution:
def solve(self , a ):
n = len(a)
if n == 0: return 0
# border condition
if a[0] != 0: return 0
if a[-1] + 1 == n: return n
# mid condition
left, right = 0, n - 1
while left < right:
mid = left + (right - left) // 2
# 相等的情况 结果只会出现在 mid 右侧
if a[mid] == mid:
left = mid + 1
# 只会出现 所在下标的取值 大于等于 当前 下标
if a[mid] > mid:
right = mid
return left