0~n-1中缺失的数字-2

力扣地址

题目描述有点问题,每个数字都在范围0~n之内,而不是0~n-1

遍历:

缺失的中间部分

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int len = nums.size();
        if (nums[0] != 0) return 0;
        if (nums[len - 1] != len) return len;
        
        int record = nums[0];
        for (int i = 0; i < len; ++i) {
            if (nums[i] - record > 1) return record + 1;
            record = nums[i];
        }
        return -1;
    }
};

二分:

考虑到数组只有一个数的情况,所以 while 循环要加等号,因为加了等号所以最终跳出循环时,low 肯定大于 high,根据条件判定,此时 low 的值就是目标数字

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int len = nums.size();
        int low = 0, high = len - 1;
        while (low <= high) {
            int mid = (low + high) >> 1;
            if (nums[mid] == mid) {
                low = mid + 1;
            }
            else {
                high = mid - 1;
            }
        }
        return low;
    }
};

异或:

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

猜你喜欢

转载自blog.csdn.net/TESE_yan/article/details/114222226