找到缺少的元素

时间:2011-01-22 20:21:10

标签: arrays algorithm

我看到了以下问题:

给定一个整数数组A,找到A中不存在的整数k。假设整数是32位有符号整数。

如何解决?

谢谢

//// update - 这是提供的解决方案 - 但我不认为它是正确的//// 考虑一个非常简单的散列函数F(x)= x mod(n + 1)。我们可以建立一个长度的位向量 n + 1初始化为0,对于A中的每个元素,我们将位F(A [i])设置为1.由于数组中只有n个元素,我们可以很容易地找到缺少的元素。

我认为上述解决方案是错误的。

例如, A [2,100,4],然后4和100都匹配到同一个地方。

3 个答案:

答案 0 :(得分:4)

如果我正确地解释了这个问题,(找不到A中的任何整数),而n是A中元素的数量,那么答案是正确的。< / p>

哈希函数可能发生冲突的事实并不重要;通过反向的鸽子原理,在位向量中将有一些位未设置 - 因为它比A中的元素具有更多的位。相应的值是不在A中的整数。在散列函数发生冲突的情况下,实际上会有多个位未设置,这有利于算法的正确性,而不是反对它。

为了说明,以下是您的示例如何解决的问题:

A = [2, 100, 4]
n = length(A) = 3
f(x) = x mod 4
map(f,A) = [2, 0, 0]

所以最终的位向量将是:

[1,0,1,0]

从那里,我们可以任意选择任何对应于任何0位的整数,在这种情况下是任何奇数。

答案 1 :(得分:1)

max (items) + 1
想到了。当然,如果其中一个元素是2 ^ 31-1而另一个元素是 - (2 ^ 32),则会失败。

如果失败,请对它们进行排序并寻找间隔。

答案 2 :(得分:1)

由于似乎没有上限或其他约束:

for (int i = int.MinValue; i <= int.MaxValue; i++)
{
    if (! A.Contains(i))
    {
       // found it !
       break;
    }
}