题目如下:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
测试示例:
输入: [0,1,2,3,4,5,6,7,9] 输出: 8输入: [0] 输出: 1
思路:二分查找。因为该数组是有序的。
二分查找算法思想:
二分查找法-python实现_朝一爱学习的博客-CSDN博客
分析:数组从0开始有序递增,得出:nums[i]==i。
左子数组:num[i]==i
右子数组:num[i]!=i
当nums[i]!=i的时候,就找到了我们要的数字。
所以我们要找的是右子数组的首位索引。
结合二分查找:
三个索引:开始,结束,中间索引。begin,end=len(nums)-1,mid=(begin+end)//2
1.num[mid]==mid,说明begin到mid中间都是有序的,空缺的数字在右边子数组。begin=mid+1
2.num[mid]>mid,说明begin到mid中间有空缺数字。end=mid-1
3.num[mid]<mid,不存在这种情况
除了第1种情况,就是第2种。
循环结束条件:begin>end
begin即为我们要找的值。
代码如下:
class Solution:
def missingNumber(self, nums: List[int]) -> int:
begin=0
end=len(nums)-1
while begin<=end:
mid=(begin+end)//2
if nums[mid]==mid:
begin=mid+1
else:
end=mid-1
return begin