268 Missing Number 缺失的数字

给出一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
案例 1
输入: [3,0,1]
输出: 2
案例 2
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
注意事项:
您的算法应该以线性复杂度运行。你能否仅使用恒定的额外空间复杂度来实现它?

详见:https://leetcode.com/problems/missing-number/description/

Java实现:

方法一:

class Solution {
    public int missingNumber(int[] nums) {
        int res=nums.length;
        int i=0;
        for(int num:nums){
            res^=num;
            res^=i;
            ++i;
        }
        return res;
    }
}

方法二:

class Solution {
    public int missingNumber(int[] nums) {
        int n=nums.length;
        int sum=0;
        for(int num:nums){
            sum+=num;
        }
        return (int)(0.5*n*(n+1)-sum);
    }
}

方法三:

用二分查找法算出中间元素的下标,然后用元素值和下标值之间做对比,如果元素值大于下标值,则说明缺失的数字在左边,此时将r赋为m,反之则将l赋为m+1。排序的时间复杂度都不止O(n),但是在面试的时候,有可能数组就是排好序的,那么此时用二分查找法肯定要优于上面两种方法。

class Solution {
    public int missingNumber(int[] nums) {
        Arrays.sort(nums);
        int l=0;
        int r=nums.length;
        while(l<r){
            int m=(l+r)>>1;
            if(nums[m]>m){
                r=m;
            }else{
                l=m+1;
            }
        }
        return r;
    }
}

参考:https://www.cnblogs.com/grandyang/p/4756677.html

原文地址:https://www.cnblogs.com/xidian2014/p/8761231.html