1-n个元素中查找缺失的一个数

1-n个元素中查找缺失的一个数

昨天拼多多面试中遇到了这个问题:一个1~n的自然数的乱序数组,其中缺失了1到n之间的某个数,如何快速找出这个数?

题意:已知一个有序数列1-n(元素值)中缺少了一个元素,找出这个元素。

1、异或可解 时间复杂度O(n)
异或有个很巧妙的地方:同一变量和该变量与另一变量的异或值的异或等于这个变量自身。所以我们可以把1~n的所有数异或,再把数组中出现的所有数异或,然后再把这两个异或的结果异或,最后得到的值即为我们要找的值。这样时间复杂度为O(n),空间复杂度为O(1)。在空间上比第二种方法要好,而且不会出现第一种方法中所说的溢出问题。

a=[0,1,2,3,4,6,7]
n=7
xor0=0
for i in range(1,n+1):
    print(i)
    xor0=xor0^i
xor1=a[0] 
for i in range(1,n):
    xor1=xor1^a[i]
print(xor0^xor1)

2、二分 时间复杂度O(lgn)

3、求和
当n不太大时,可以考虑求和。先算出1~n的所有数的和,然后减去数组中出现的所有自然数的和。时间复杂度为O(n),空间复杂度O(1)。这种方法的缺点是n不能太大,n比较大时,求和容易溢出。

4、位图。从头到尾的扫描整个数组,把出现的数相应的位设置为1.然后再扫描位图,找出不为1的那一位,即为要找的数。这种方法的时间复杂度为O(n),空间复杂度为O(n)。

#二分查找有序数组中缺失的一个元素,时间复杂度尽可能低
def bsearch(a,left,right):
    while(left+1<right):
        print(left," ",right)
        mid=left+(right-left)//2
       #这种情况说明缺失的元素在前面 
        if (a[mid]==mid+1):
            left=mid+1
        elif (a[mid]==mid+2):
            right=mid-1
    return left+1
def findMis(a,n):
    return bsearch(a,0,n-1)
a=[1,2,4,5,6,7,8,9]
n=9
print(findMis(a,n))    

1- n这n个数随机减少两个数后,

放在A[]中(打乱顺序),以时间复杂度为O(n)的算法找到减少的这2个数

【思路】:如果是减少1个数,那么大家都知道方法——循环一次,求A[]的和sum以及(1+2+…+n)=SUM,然后用SUM-sum就能得到结果。可是,现在出现2个数,那么导致只求和是不行的,那么请问能怎么办?那就通过别的运算记录更多的信息!四则运算有加减乘除吗?别老是记着+,把别的兄弟都给忘了!

猜你喜欢

转载自blog.csdn.net/weixin_42462804/article/details/108588096
今日推荐