(python)小菜狗算法日记(数组系列)_leetcode 面试题53 - II. 0~n-1中缺失的数字

一个长度为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

限制:

1 <= 数组长度 <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof
先写的暴力遍历前后两个数,但需要考虑一些边界情况,如缺失的数是最左边的0,或最右边的数len(nums)

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        lens = len(nums)
        if nums[0]!=0: #缺最左边0的情况
            return 0
        if lens==1: #因为我的循环从1开始,先处理[0]缺1这种情况
            return 1
        for i in range(1,lens):
            if nums[i]!=nums[i-1]+1:
                return i
        return i+1 #缺最右边len(nums)的情况

写了这个代码以后发现这种暴力太费事儿了,这个题不就是判断值是不是等于它的索引值吗,换个暴力:

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        lens = len(nums)
        for i in range(lens):
            if i!=nums[i]:
                return i
        return i+1

所谓有序所以二分,一开始想二分以后判断前半段和后半段是不是等于它们该有的长度,后来想到索引这回事以后感觉根本不用那么麻烦,直接二分后判断中间值是否等于索引就行了,等的话说明左边不缺,右边缺,不等的话说明左边缺,右边不缺。一直缩小查找范围,当左指针等于右指针时,退出循环,该指针就是缺失值。

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        lens = len(nums)
        l = 0
        r = lens
        while l<r:
            mid = (l+r)>>1
            if nums[mid]==mid:
                l=mid+1
            else:
                r = mid
        return l

不过不知道为什莫我这个代码效率不高

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值