给出一个first n
个自然数的数组,其中缺少一个元素,一个重复元素。找出两个数字。采访中有人问我这个问题。
例如,示例数组为
5, 2, 1, 4, 5
where n=5
给定数组的答案应为:
missing element = 3
duplicate element = 5
是否有可能在不迭代数组的情况下提出解决方案。
我能够提出一个复杂度为O(nlogn)的解决方案,而无需额外的空间。是否存在O(n)解决方案(没有额外的空间)?
答案 0 :(得分:4)
假设您有数字1,...,n
。现在,将它们的总和1 + 2 + ... + n
表示为S
。如果将缺失数表示为j
,将重复数表示为k
,则将得到修改后的总和S' = S - j + k
,因此这是两个变量的一个等式。我们可以重复相同的过程,但是这次,将第二次幂相加,即S_2 = 1 + 4 + ... + n^2
。对于缺少一个和一个重复编号的序列,结果将为S_2' = S_2 - j*j + k*k
。这样我们就得到了两个关于两个变量的方程。
总共,我们有:
S' = S - j + k
S_2' = S_2 - j*j + k*k
因此
k - j = S' - S =: a
k*k - j*j = S_2' - S_2 =: b
我们引入了符号a
和b
来简化表示法。
现在,k*k - j*j = (k - j)*(k + j)
,因此:
k - j = a
k*k - j*j = a * (k + j) = b
对两个方程求和得出:
2*k = b/a + a
2*j = b/a - a
对于您的特定示例:
S = 1 + 2 + 3 + 4 + 5 = 15
S_2 = 1 + 4 + 9 + 16 + 25 = 55
对于缺少一个元素和一个重复元素的系列:
S' = 5 + 2 + 1 + 4 + 5 = 17
S_2' = 25 + 4 + 1 + 16 + 25 = 71
然后:
a = S' - S = 2
b = S_2' - S_2 = 16
因此:
2*k = 8 + 2 = 10
2*j = 8 - 2 = 6
给出:
k = 5, j = 3
在实践中(如@HermanTheGermanHesse所述),对于S
以及S_2
的{{1}}的多项式而言,人们可以获得封闭式expressions(因此称为Faulhaber的公式),即:n
和S = n*(n+1)/2
。因此,只需遍历输入数据,累加S_2 = n*(n+1)*(2*n+1)/6
和S'
并使用上面给出的S_2'
和k
的公式就足够了……