美文网首页
剑指offer 56- 0到n-1中缺失的数字

剑指offer 56- 0到n-1中缺失的数字

作者: 顾子豪 | 来源:发表于2021-06-03 10:36 被阅读0次

一个长度为 n−1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0 到 n−1之内。

在范围 0到 n−1 的 n个数字中有且只有一个数字不在该数组中,请找出这个数字。

样例

输入:[0,1,2,4]

输出:3

分析:
算法一:数学推导O(N)

假设缺失值是x,则sum = 0 + 1 + … + (x-1) + (x+1) + …+(n+1)
n*(n+1)/2 = 0 + 1 + … + (x-1) + x+ (x+1) + …+(n+1) = sum + x
最终结果:x = n*(n+1)/2 - sum

class Solution {
public:
    int getMissingNumber(vector<int>& nums) {
        int n = nums.size();
        int sum = 0;
        for(auto x:nums) sum += x;
        return (n*(n+1)/2 - sum);
    }
};

算法二:使用二分O(logN)

观察数据的特点:具有二段性
即黄色部分满足:nums[i] = i

红色部分::nums[i] != i
还有一种特殊情况是所有的nums[i] = i 此时缺失的值就是最后一个数据,即n
时间复杂度:O(logN)

class Solution {
public:
    int getMissingNumber(vector<int>& nums) {
        if(nums.empty()) return 0; 
        int l=0, r = nums.size()-1;
        // if (nums[r] == r) r ++ ;
        if(nums.back() != r+1) return r+1; //特判:缺失的是最后一个

        while(l<r) {
            int mid = l+r >> 1;
            if(nums[mid] != mid) r = mid;
            else l= mid+1;
        }
        return r;
    }
};

相关文章

网友评论

      本文标题:剑指offer 56- 0到n-1中缺失的数字

      本文链接:https://www.haomeiwen.com/subject/wupwjltx.html