【入门】5、缺失数字

描述
从 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值