有一个大小为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)中工作吗?
答案 0 :(得分:61)
答案 1 :(得分:2)
添加元素非常精细,在计算元素总和和预期总和时,只需要取中间聚合的mod(%)。对于mod操作,您可以使用类似2n的内容。您还必须在减法后修复该值。