在O(n)和常数空间中找到重复

时间:2012-01-31 00:00:54

标签: algorithm

  

可能重复:
  Easy interview question got harder: given numbers 1..100, find the missing number(s)
  Find the missing and duplicate elements in an array in linear time and constant space

我在一个论坛上看到了一个有趣的问题。

你有100个元素,从1到100但是由于错误,其中一个数字重复了另一个重复自己。 例如。 1,99,3,...,99,100 数组不是排序格式,如何查找重复数?

我知道哈希可以做O(n)时间和O(n)空间,我需要O(1)空间。

4 个答案:

答案 0 :(得分:23)

计算两个总和:和和平方和。

在你的例子中:

sum = 1+99+3...+100

sq_sum = 1^2+99^2+3^2+...+100^2

假设y在序列中替换了x。

sum = n(n+1)/2 -y+x.
sq_sum = n(n+1)(2n+1)/6 -x^2 +y^2

现在,解决x&收率

恒定空间和O(n)时间。

如何解决x和y

从等式:

x = sum - n(n+1)/2 +y

在第二个等式中替换它:

sq_sum = n(n+1)(2n+1)/6 -(sum - n(n+1)/2 +y)^2 +y^2

请注意,y ^ 2取消,您将得到一个只有一个未知的线性方程:y。解决它!

答案 1 :(得分:4)

新方法。让m为缺失的数字,r为重复的数字。通过数组一次,让X成为XOR数组条目以及索引1n的结果。然后是X = m XOR r。特别是,它不是0。设bX的任何非零位(您只需选择一个,因为X不是0,所以存在一个)。通过数组,让Y成为XOR数组条目和1nb的结果0 Z {1}}让XOR成为1数组条目和nb1Y的结果Z {1}}。然后mr持有Xb,所以剩下的就是做最后一遍以查看数组中的哪一个。

总空间:4(如果您为Y重复使用Z,则为3)

总时间:7次通过(如果您在阵列的同时进行索引并同时计算O(1)O(n),则为3次。

因此{{1}}空格和{{1}}时间。

答案 2 :(得分:1)

我们可以在O(n)和恒定空间中进行:

  1. 对于每个元素,请计算index = Math.abs(a[i]) - 1
  2. 检查index处的值
    • 如果是正数,则乘以-1,即使其为负数。
    • 如果是否定的,则返回(index+1)作为答案,因为这意味着我们之前已经看过这个索引。
  3. “”

    static int findDup(int[] a){
        for(int i=0;i<a.length;i++){
            int index = Math.abs(a[i]) - 1;
            if(a[index] < 0)
                return index+1;
            else
                a[index] = -1 * a[index];
        }
        return -1;
    }
    

答案 3 :(得分:-1)

计算所有整数的总和 计算int p = sum%100 100 - p就是答案