思路1
先排序,再依次查找,如果下一个值不等于前一个+1,那么下一个值就是消失数字。
时间复杂度分析:冒泡排序的时间复杂度为O(N^2),qsort排序时间复杂度为O(N*logN)。因此该思路不可行。
思路2
求和0到N,再减去数组中求和的值。
时间复杂度分析:两次循环,结果为O(N)。因此该思路可行,但有内存溢出风险。(这边可以通过等差数列求和公式求和,这样只需要一次循环,速度更快)
思路3
通过异或操作符号,相同的值为0,不相同的值为1;因为有 a^a = 0 已经 0^a = a 这两条性质,第一次遍历循环把数组全部的元素异或,第二次遍历循环再把numSize大小的元素异或,那么就可以找到只出现了一次的数字,即为消失的数字。(可以通过下图辅助理解)
时间复杂度:两次次循环,结果为O(N)。因此该思路可行,同时没有溢出风险,是最优解。
思路2的代码:
cpp
int missingNumber(int* nums, int numsSize){
int sum=0,i=0,cmp=0;
for(i=0;i<numsSize;i++)
sum+=nums[i];
for(i=0;i<=numsSize;i++)
cmp+=i;
return cmp-sum;
}
思路3的代码:
cpp
int missingNumber(int* nums, int numsSize){
int N=numsSize;
int x=0;
for(int i=0;i<numsSize;i++)
{
x^=nums[i];
}
for(int j=0;j<=N;j++)
{
x^=j;
}
return x;
}