LeetCode-268-丢失的数字

LeetCode-268-丢失的数字_第1张图片

1、数学

考虑到题目明确数组的范围是[0,n],因此我们可以将此区间内的元素进行累加,而后减去我们给定数组中的元素之和,差值即为缺失的数字。

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

2、异或

考虑到数组中确实一个数字,我们可以先求出当前数组中所有元素的异或结果。而后我们再将当前结果与区间[0,n]中所有元素异或的结果进行异或运算。由于在异或运算中,相同元素结果为0,不同元素结果为1,故最后的结果即为缺失的数字。

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

3、排序

我们可以先将数组进行排序,而后找到第一个位置序号与对应值不相符的元素即可。

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int n = nums.size();
        for (int i = 0; i < n; i++) {
            if (nums[i] != i) {
                return i;
            }
        }
        return n;
    }
};

4、哈希表

我们可以统计每个元素是否出现,最终哈希集合中没出现的元素即为缺失的数字。

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        unordered_set<int> set;
        int n = nums.size();
        for (int i = 0; i < n; i++) {
            set.insert(nums[i]);
        }
        int missing = -1;
        for (int i = 0; i <= n; i++) {
            if (!set.count(i)) {
                missing = i;
                break;
            }
        }
        return missing;
    }
};

你可能感兴趣的:(LeetCode刷题记录,leetcode,算法,数据结构)