Missing Number

Description

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

Example 1:

Input: [3,0,1]
Output: 2

Example 2:

Input: [9,6,4,2,3,5,7,0,1]
Output: 8

Note: Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?

Solutions

My solution

Idea: if nums[i] > 0, mark its existence by subtracting n + 1 from nums[nums[i] - 1] (so it is < 0). Use a separate variable to mark the existence of 0.

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        bool zero = false;
        for(int num : nums){
            int val = num < 0 ? num + n + 1 : num;
            if(val == 0)
                zero = true;
            else{
                int idx = val - 1;
                nums[idx] -= (n + 1);
            }
        }
        if(!zero) return 0;
        int i;
        for(i = 0; i < n; ++i){
            if(nums[i] >= 0)
                break;
        }
        return i + 1;
    }
};

Optimal solution

Idea: use XOR. Becausea XOR a XOR b == b.

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

Last updated