Given an array containing n distinct numbers taken from 0, 1, 2, ..., n
, find the one that is missing from the array.
For example,
Given nums = [0, 1, 3]
return 2
.
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
思路:
寻找缺失数字一般最常用的方法就是通过异或操作进行。解决该题目的基本步骤:
1)找到数组的最大元素maxNum,这样可以设定进行异或操作的边界;
2)如果数组中有0元素,将标志hasZero设置为1;
3)遍历数组,先将当前元素与element进行异或操作,然后将返回结果result与当前异或结果进行异或操作,最后将element进行减1操作。
4)如果同时满足hasZero不为0而且result为0,则令result=maxNum+1.
Note:
对于[0, 1, 2, 3] 应该返回4;
对于数组[1, 2, 3],应该返回0,这也是为什么在答案中处理是否有0元素的原因。
代码实现:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int result = 0;
int cur = 0;
bool hasZero = false;
//find the max element
int maxNum = nums[0];
for(int i = 0; i < nums.size(); ++i)
{
if(nums[i] > maxNum)
maxNum = nums[i];
if(nums[i] == 0)
hasZero = true;
}
//find the missing element
int element = maxNum;
for(int i = 0; i < nums.size(); ++i)
{
cur = nums[i]^element;
result ^= cur;
--element;
}
if(!result && hasZero) result = maxNum + 1;
return result;
}
};