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

本文介绍了如何使用二分法解决一种特殊的排序数组问题,数组中长度为n-1,且所有数字在0~n-1范围内,有一个数字缺失。通过分析数组特性,可以找到第一个不匹配的索引来确定缺失数字。当缺失数字为最后一个时,直接返回数组长度即可。给出的C++代码实现展示了这种方法的逻辑。

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

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

方法:二分法

关键点:排序数组当中如果不缺项,那么应有:索引 = 索引处内容,即 nums[i]=inums[i] = inums[i]=i,如下图所示:

在这里插入图片描述
若当中出现缺项,则会导致其后所有位置索引 != 索引处内容,即 nums[i]!=inums[i] != inums[i]=i ,如下图所示:

在这里插入图片描述
只需要找到第一个不匹配的数的索引2即可。

采用二分法搜索:

  1. 初始情况:i=0,j=nums[].size()−1,m=(i+j)/2i = 0,j = nums[].size()-1,m = (i+j)/2i=0j=nums[].size()1m=(i+j)/2
  2. nums[m]==mnums[m] == mnums[m]==m,则证明要找的数在区间[m+1,j][ m+1,j ][m+1j]当中,此时可越过mmm
  3. nums[m]!=mnums[m] != mnums[m]=m,则证明要找的数在区间[i,m][ i,m ][im],此时注意要包括mmm,有可能nums[m]nums[m]nums[m]就是要找的数。
  4. i==ji == ji==j时输出即可。

特殊情况:当缺少的数为最后一个时,如:

输入: [0,1,2]
输出: 3

我们可以找到规律,当缺少的数不是最后一个时,数组中的最后一个数是等于数组长度的,若不等,则就是此种特殊情况,此时直接输出数组长度即可。

C++

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int l = nums.size();
        if (nums[l-1] != l) return l;
        int i = 0,j = l-1;
        while(i<j){
            int m = (i+j) / 2;
            if(m==nums[m]) i = m+1;
            else j = m;
        }
        return i;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值