描述
从 0,1,2,…,n 这 n+1 个数中选择 n 个数,选择出的数字依然保持有序,找出这 n 个数中缺失的那个数,要求 O(n) 或 O(log(n)) 并尽可能小。
方一:根据等差数列的求和公式
思路:因为0-n个数里面只缺少一个数,所以可以直接对0-n求和,然后再减去该a数组的和就是答案了。
class Solution:
def solve(self , a ):
length=len(a)
sum1,sum2=0,0
for i in range(length+1): #首先计算出正常数组的和
sum1+=i
for i in range(length): #然后计算出题目a数组的和
sum2+=a[i]
return sum1-sum2
方二:循环找a[i]!=i时的i
class Solution:
def solve(self , a ):
length=len(a)
for i in range(length):
if a[i]!=i:
return i
return length #[0,1,2,3,4,5,6,7,8]时,输出9
方三:二分查找
class Solution:
def solve(self , a ):
length=len(a)
left=0
right=length-1
while(left<=right):
mid=(left+right)//2
if a[mid]==mid: #如果 a[i]==i 说明mid及mid以左的数都不是目标值
left=mid+1 #此时答案位于mid右侧
if a[mid]>mid:
right=mid-1
return left