一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
建议尝试思考coding后,在查看答案📖
解题思路:
排序数组中的搜索问题,首先想到 二分法 解决。根据题意,数组可以按照以下规则
划分为两部分。
左子数组:nums[i] = i;
右子数组:nums[i]!=i;
缺失的数字等于 “右子数组的首位元素” 对应的索引;因此考虑使用二分法查找
“右子数组的首位元素” 。
复杂度分析:
-
时间复杂度 O(log N): 二分法为对数级别复杂度。
-
空间复杂度O(1): 几个变量使用常数大小的额外空间。
from typing import List#引用typing模块,这样就可以标注List[int] class solution: def missingNumber(self,nums:List[int]) -> int: #List[int]也可标注为[int] left,right=0,len(nums)-1 #用二分法,先把列表左右的初始位置给出 while left<=right: mid=(left+right)//2 #下整除得中间位置数 if mid==nums[mid]:left=mid+1 #满足条件--缩小到后半区域[mid+1,right] else:right=mid-1 #满足条件--缩小到前半区域[left,mid-1] return left a=[0,1,2,3,4,6,7,8] b=[0,2,3,4] print(solution().missingNumber(a))#调用类,方法一 ##调用类方法二 S=solution() print(S.missingNumber(b))