【leetcode】剑指 Offer 53 - II. 0~n-1中缺失的数字

文章讨论了一道编程题,涉及一个长度为n-1的递增排序数组,目标是找到范围0~n-1内缺失的数字。作者提供了遍历和二分法两种解决方案,强调在刷题时思考方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一开始题目没看明白,测试用例出现了个[0]期望输出为1给我看懵了。

关键问题在于“一个长度为n-1的递增排序数组”、“范围0~n-1内的n个数字”,比如[0]这个例子,长度为1,也就是n=2,它应该包含0-n-1也就是0-1两个数字。所以这个这个题目和例子就很狡猾。

原创但遍历版本。因为最后一个元素有时候会发生数组越界,所以尝试用了try:

class Solution(object):
    def missingNumber(self, nums):
        n=len(nums)
        for i in range(0,n+1):
            try:
                if nums[i]==i:
                    continue
                else:
                    return i
            except Exception:
                return i

去掉try:

class Solution(object):
    def missingNumber(self, nums):
        n=len(nums)
        i=0
        while i<n:
            if nums[i]==i:
                i=i+1
                continue
            if nums[i]!=i:
                return i
        return i

然后是大佬的二分法,https://leetcode.cn/problems/que-shi-de-shu-zi-lcof/solution/mian-shi-ti-53-ii-0n-1zhong-que-shi-de-shu-zi-er-f/

遍历简单不过脑,刷题还是要好好想方法才行哇。

二分法的思路是这样的,把数组分为左子数组和右子数组,左子数组是正常的,nums[i]=i的,右子数组是已经发生了错位的,nums[i]!=i的。目标是找出右子数组的第一个元素。

当中间值nums[m]=m时,说明左边的数组元素都没问题,需要找到元素在右边。

当中间值nums[m]!=m时,说明错位已经发生,需要找到元素在左边。

以下是代码:

class Solution:
    def missingNumber(self, nums):
        i, j = 0, len(nums) - 1
        while i <= j:
            m = (i + j) // 2
            if nums[m] == m: i = m + 1
            else: j = m - 1
        return i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值