题意
给一个大小为n的数组,里面的元素为[0, n]中缺了一个数字,求缺的那个数字。
要求:
- O(n) 时间。
- O(1) 空间。
思路
算法1
如果数组包含[1, n]那么它的和为 n(n+1)2 。那么我们现在只需要对数组求和,两个相减,得到的就是缺失的那个数字了。
算法2
利用异或。
我们知道^
为:1 ^ 1 = 0
, 0 ^ 1 = 1
。
那么,就可以得到这样两个结论:
x ^ x = 0
0 ^ 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;
}
};