数组nums
包含从0
到numsSize
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。
示例 1:
输入:[3,0,1] 输出:2示例 2:
输入:[9,6,4,2,3,5,7,0,1] 输出:8
方法一:求和
对0-n的数字求和,再减去数组元素和,最后剩余值为消失的数字
时间复杂度:O(n)
空间复杂度:O(1)
int missingNumber(int* nums, int numsSize)
{
//0-n求和,等差数列
int sum = numsSize*(numsSize+1)/2;
for(int i = 0; i < numsSize; ++i){
sum -= nums[i];
}
return sum;
}
方法二:异或
异或:相同为0,相异为1。0^a=a。a^a=0,a^b=1
将数组中的元素与0--n的元素异或,最后剩下的异或后值为消失的数字
第一个循环将数组中的所有元素异或再ret中,将ret在于0--n的元素异或,其中重复的元素异或后为0,只剩下单独的一个元素没有配对,即为消失的数字。
int missingNumber(int* nums, int numsSize)
{
int ret=0;
for(int i=0;i<numsSize;i++)
{
ret^=nums[i];
}
for(int i=0;i<=numsSize;i++)
{
ret^=i;
}
return ret;
}
方法三:排序
qsort | 冒泡 | |
时间复杂度 | O(logN*N) | O(N^2) |
空间复杂度 | O(logN) | O(1) |