一、题目描述

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

二/题解
有序数组,使用二分法
时间复杂度:O(log n)
在这里插入图片描述

class Solution {
    public int missingNumber(int[] nums) {
        if(nums[0]!=0) return 0;
        int n = nums.length;
        int left = 0,right = n-1;
        
        while(left <= right){
            int mid = left + ((right - left)>>1);
            if(nums[mid]!=mid&&nums[mid-1]==mid-1)
                return mid;
            else if(nums[mid]==mid)
                left = mid + 1;
            else
                right = mid - 1;
        }
        return n;
    }
}

优化:

class Solution {
    public int missingNumber(int[] nums) {
        
        int left = 0,right = nums.length-1;
        
        while(left <= right){
            int mid = left + ((right - left)>>1);
            if(nums[mid]==mid)
                left = mid + 1;
            else
                right = mid - 1;
        }
        return left;
    }
}

在这里插入图片描述

方法二:异或
如果数组无序,可使用异或
数组的长度为n-1,且数字范围都在0到n-1内,我们将数组中的n-1个数字与0到n-1共n个数依次进行异或,异或相同的数字得000,最后剩下来的就只有缺失的数字
时间复杂度:o(n)

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int res = nums.size();
        for(int i = 0;i < nums.size();i++){
            res ^= nums[i] ^ i;
        }
        return res;
    }
};

在这里插入图片描述

posted on 2021-02-17 21:44  曹婷婷  阅读(39)  评论(0编辑  收藏  举报