跳转至

268.Missing Number

Tags: Math Array Bit Manipulation

Links: https://leetcode.com/problems/missing-number/


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?


class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        int sum = (1 + n) * n / 2;
        return sum - accumulate(nums.begin(), nums.end(), 0);
    }
};

用等差数列的求和公式求出0到n之间所有的数字之和,然后再遍历数组算出给定数字的累积和,然后做减法,差值就是丢失的那个数字

位运算方法:

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

        return sum ^ n;
    }
};

既然0到n之间少了一个数,我们将这个少了一个数的数组合0到n之间完整的数组异或一下,那么相同的数字都变为0了,剩下的就是少了的那个数字了

二分的方法,虽然多余,但是如果一开始给出的数组是有序的,那么二分显然是最优的。

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        int left = 0, right = n;

        sort(nums.begin(), nums.end());
        while (left < right) {
            int middle = left + ((right - left) >> 1);
            if (nums[middle] > middle) right = middle;
            else left = middle + 1;
        }

        return left;
    }
};