题意
给一个大小为n的数组,里面的元素为[0, n]中缺了一个数字,求缺的那个数字。
要求:
- O(n)时间。
- O(1)空间。
思路
算法1
如果数组包含[1, n]那么它的和为n(n+1)2。那么我们现在只需要对数组求和,两个相减,得到的就是缺失的那个数字了。
算法2
利用异或。
我们知道^为:1 ^ 1 = 0, 0 ^ 1 = 1。
那么,就可以得到这样两个结论:
x ^ x = 00 ^ x = x
然后,对于这道题,我们可以另x1 = 0 ^ 1 ^ 2 ^ ....^ n,x2 = a[0] ^ a[0] ^...a[n - 1]
最后,我们用x1 ^ x2,可以知道:如果一个数y在a[]中出现过,假设为ak,那么y ^ a[k] = 0。
基于这个思想,假设我们没有出现的数是z,那么我们最后x1 ^ x2的结果即为:0 ^ z = z。
代码
//algorithm1
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
long long sum = 0;
long long y = (long long)((n + 1) * n / 2);
for (auto x : nums) sum += x;
return y - sum;
}
};
//algorithm 2
class Solution {
public:
int missingNumber(vector<int>& nums) {
int x1 = 0, x2 = 0, n = nums.size();
for (int i = 0; i < n; i++) {
x1 ^= (i + 1);
x2 ^= nums[i];
}
return x1 ^ x2;
}
};

本文介绍了两种在O(n)时间复杂度和O(1)空间复杂度下寻找数组中缺失数字的方法。一种是通过计算数组总和与理想总和之差来找到缺失的数字;另一种是使用异或操作来找出缺失的数字。
&spm=1001.2101.3001.5002&articleId=55254513&d=1&t=3&u=edaa5c376556414e93137627a4cb849d)
707

被折叠的 条评论
为什么被折叠?



