找出数组中的重复元素

时间:2011-08-19 05:39:56

标签: c arrays algorithm complexity-theory big-o

有一个大小为n的数组,数组中包含的元素介于1和n-1之间,因此每个元素出现一次,只有一个元素出现多次。我们需要找到这个元素。

虽然这是一个非常常见问题解答,但我仍然没有找到合适的答案。大多数建议是我应该将数组中的所有元素相加,然后从中减去所有索引的总和,但如果元素的数量非常大,这将不起作用。它会溢出。关于XOR门dup = dup ^ arr[i] ^ i的使用也有一些建议,我不清楚。

我已经提出了这个算法,它是对加法算法的一种增强,可以在很大程度上减少溢出的可能性!

for i=0 to n-1
  begin :
    diff = A[i] - i;
    sum  = sum + diff;
  end

diff包含重复元素,但使用此方法我无法找到重复元素的索引。为此,我需要再次遍历数组,这是不可取的。任何人都可以提出一个更好的解决方案,不涉及添加方法或XOR方法在O(n)中工作吗?

2 个答案:

答案 0 :(得分:61)

答案 1 :(得分:2)

添加元素非常精细,在计算元素总和和预期总和时,只需要取中间聚合的mod(%)。对于mod操作,您可以使用类似2n的内容。您还必须在减法后修复该值。