我看到了以下问题:
给定一个整数数组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都匹配到同一个地方。
答案 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;
}
}