题目描述:
给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
示例 1:
输入: [3,0,1]
输出: 2
示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
方法1:异或操作
主要思路:
(1)成对元素的异或操作结果为0,利用这个特性,把所有元素和索引异或了,最后再和 nums.size()异或,既可获得确实的数;
class Solution {
public:
int missingNumber(vector<int>& nums) {
int res=0;
int i=0;
for(int num:nums){
res^=num^(i++);
}
res^=i;//最后的异或
return res;
}
};
方法2:求和操作
主要思路:
(1)把0到n的和求出,减去数组中的元素的和,就得到缺失的数字
class Solution {
public:
int missingNumber(vector<int>& nums) {
int sum1=(1+nums.size())*nums.size()/2;
int sum2=accumulate(nums.begin(),nums.end(),0);
return sum1-sum2;
}
};
方法3:避免溢出的求和操作
主要思路:
(1)为了避免溢出,可以边减,边求和
class Solution {
public:
int missingNumber(vector<int>& nums) {
int index=0;
int sum=0;
for(int& num:nums){
sum+=(index++)-num;//边减边求和
}
return sum+nums.size();
}
};