Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
一个包含n个元素的整数数组,其元素取值范围为0~n,且不含相同的元素,查找其中不存在的数(0~n)。要求线性时间复杂度和常数空间复杂度。
分析:数组元素取值为0~n之间的数,且除了所求缺失的数外其他数均存在。
法一:可用一个简单的标记法来得出,即用一个包含0~n共n+1个元素的数组来标记,存在的数记为1,不存在记为0,遍历这个数组,值为0的元素的数组下标即为缺失的数。
代码如下:
int missingNumber(vector<int>& nums) {
int length = nums.size() + 1;
int result = 0;
vector<int> flags(length, 0);
for (int i = 0; i < length - 1; i++)
flags[nums[i]] = 1;
for (int i = 0; i < length; i++)
{
if (flags[i] == 0)
{
result = i;
break;
}
}
return result;
}
法二:可求出0~n共n+1个整数的和,并求出原数组所有元素的和,前者与后者之差即为缺失的数。
代码如下:
int missingNumber(vector<int>& nums) {
long long sum = 0;
for (int num : nums)
sum += num;
int n = nums.size();
long long total=n*(n+1)/2;
return (int)(total-sum);
}
浙公网安备 33010602011771号