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?
最简单的方法,有可能溢出。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int gap = 0;
for (int i = 0; i < nums.size(); ++i) {
gap += (i + 1) - nums[i];
}
return gap;
}
};
用异或操作可以避免潜在的溢出。相同的两个数异或为0,任何数与0异或为它自身。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int gap = 0;
for (int i = 0; i < nums.size(); ++i) {
gap ^=(i + 1) ^ nums[i];
}
return gap;
}
}
再复杂的方法,用计数排序的思想,各就各位,不在位置上的就是缺失的数字。
class Solution {
public:
int missingNumber(vector<int>& nums) {
for (int i = 0; i < nums.size(); ++i) {
while (nums[i] != i && nums[i] != -1) {
if (nums[i] == nums.size()) {
nums[i] = -1;
}
else {
swap(nums[i], nums[nums[i]]);
}
}
}
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] == -1) {
return i;
}
}
return nums.size();
}
};