一,题目
backgroud:数组nums包含从0到n的所有整数,但其中缺了一个。
question: 请在O(N)时间内找出该缺失的整数。
原题在此:
二,解法
解法一:(求和)
1.把该缺失数组当成完整数组进行求和(sum 1)
(1+2+3+4.......+n等差数列求和)(Sn=【(1+n)n】/2)
2.缺失数组(题目已给)中的值进行累加(sum 2)
3.两者相减(sum 1-sum 2)
该解法时间复杂度O(N)
代码如下:
解法二:(位运算求解)
1.x=0
2.x跟0-n之间数异或
3.x再跟数组中的值异或
4.return返回的那个数即为所缺失的数
思路:
题意为数字从[0,n]之间的n+1个数字中少了一个,如果我们补全该数组,那么除了缺失的数字,其余均成对出现,利用位运算的规律即可找出缺失的数。
关于位运算有如下几个规律:
1^1=0
1^0=1
0^1=1
0^0=0
也就是说0和1异或时相同的异或结果为0,不同的异或结果为1,根据上面的规律可得:
a^a=0; (自己和自己异或等于0)
a^0=a; (任何数字和零异或还是它本身)
a^b^c=a^c^b; (异或运算具有交换率)
利用这三个规律,这道题就迎刃而解了,只需要把所有的数字都异或一遍,最终的结果就是消失的那个数字
该解法时间复杂度为O(N)
代码如下:
相当于x=0^nums[i]^i
当num【i】与i相等时,异或为零,除了缺失的数,其他的数字都有伴,所以缺失数字最后会被剩下,赋于x,然后return x,该数组缺失数字就找到了
第一个for循环把除缺失数以外的其他数一个个拎出来,拎出来的一个个去第二个for循环中和【0~n】异或,找到和自己相同的数,便被异或为0
最终x=0^消失的数字^0^0^0^0^0^0^0^0^0.......^0
于是消失的数字便找到了
解法三:
(该解法的时间复杂度为O(N*logN),虽不符合题中O(N)的要求,但该思路值得写一写)
1,给该数组由小到大排序(qsort快排)
2,一次查找出一个数,查找出的数加一,看是否等于下一个数
3,若等于就继续,不等于查找出的数加一就是缺失的数字
附上一张复杂度对比表:
可见复杂度O(N)比复杂度O(Nlog*N)的代码优化的不是一星半点。
(The End)