这与this问题有关,但有点调整。 我们给出一个包含1到1000之间整数的数组。 从1到1000的每个整数都在数组中一次,但是一个在数组中两次。 (即我从列表中删除一个唯一的元素并引入一个已经在列表中的重复元素,记住数组的大小仍然是1000)
在我发布的链接中,它完全是一个不同的问题。
我的解决方案:
对数组进行排序,然后查找这两个元素是否在一起。 (平均案例O(nlog(n)))
创建一个1000位的位数组(赢得了很多内存)。在每个位字段中存储0。遍历1000个元素的数组,并使用数组的值翻转位数组索引中的位符号。
即。 (如果数组的第0个位置存储值548,我们将位数组中的第548位翻转为1)。
已经翻转为1的字段将是重复元素
Solution2只迭代一次数组。
现在,我正在阅读有关伸缩系列的内容,我还没有完全理解它。但是在那里(或者在离散数学中)有一个概念,我们可以将某些东西加总并用其他东西减去以获得重复的数字吗?
答案 0 :(得分:4)
计算数组的总和,让它为 S ,让重复的元素为 x 。重复元素可以通过取 S 和sum of the array without the repeated element: x = S-(1000 *(1001))/ 2 之间的差异来确定。
答案 1 :(得分:1)
让我们说,x
被y
取代。求和方法告诉
y - x = sum_actual - sum_expected
当然,你不能从一个方程中推导出两个变量;你需要另一个。计算平方和:
y^2 - x^2 = sum_squares_actual - sum_squares_expected
现在回想一下,平方和是n*(n+1)*(2*n + 1)/6
答案 2 :(得分:0)
总和为1 ... 1000 = 1001 * 500,因此为零模1001.因此,找到数组模1001的总和将给出重复元素。
result = 0
for x in A:
result = (result + x) % 1001
答案 3 :(得分:0)
1000不是那么大。除了其他人所说的,你可以使用count数组。对于每个数字x,您更新计数count[x] = count[x] + 1
并检查此数字是否等于2
。