题目:数组nums
包含从0
到n
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?(该题链接:面试题 17.04. 消失的数字 - 力扣(LeetCode))
首先在完成这个题目之前,我们先来捋捋自己的思路,来看看哪些是最优算法,时间复杂度小,值得我们实现。
思路一:排序+遍历(后一个数字等于前一个数字加一,若不等于,那后一个数字就是消失的数字)
时间复杂度:O(N * N)
这种方法的复杂度太高,没有实现的必要,因此放弃该思路。
思路二:用等差数列计算0~N的和,再依次减去数组内的值,结果就是消失的数字
时间复杂度 :O(N)
这种方法复杂度可以,因此可以用程序来实现。
int missingNumber(int* nums, int numsSize){
int x=numsSize*(numsSize+1)/2;//计算0~N的和
int i=0;
for(i=0;i<numsSize;i++)
{
x -= nums[i];//用和来依次减
}
return x;
}
思路三:数字两两成团,可以用按位与或来解决(按位与或属于操作符,可以看我的这篇关于操作符的博客:C语言初阶之操作符详解_囚徒玩电脑的博客-CSDN博客)
时间复杂度:O(N)
异或:^ ——对应二进制位相同为0,相反为1
0和任何数按位与或就是那个数
int missingNumber(int* nums, int numsSize){
int x=0;
int i=0;
for(i=0;i<=numsSize;i++)
{
x ^= i;
}
for(i=0;i<numsSize;i++)
{
x ^= nums[i];
}
return x;
}
本道题的讲解就到此结束啦,大家有什么疑问,欢迎在评论区评论或者私信我!!!!