可能重复:
Easy interview question got harder: given numbers 1..100, find the missing number(s)
Find the missing and duplicate elements in an array in linear time and constant space
我在一个论坛上看到了一个有趣的问题。
你有100个元素,从1到100但是由于错误,其中一个数字重复了另一个重复自己。 例如。 1,99,3,...,99,100 数组不是排序格式,如何查找重复数?
我知道哈希可以做O(n)时间和O(n)空间,我需要O(1)空间。
答案 0 :(得分:23)
计算两个总和:和和平方和。
在你的例子中:
sum = 1+99+3...+100
sq_sum = 1^2+99^2+3^2+...+100^2
假设y在序列中替换了x。
sum = n(n+1)/2 -y+x.
sq_sum = n(n+1)(2n+1)/6 -x^2 +y^2
现在,解决x&收率
恒定空间和O(n)时间。
从等式:
x = sum - n(n+1)/2 +y
在第二个等式中替换它:
sq_sum = n(n+1)(2n+1)/6 -(sum - n(n+1)/2 +y)^2 +y^2
请注意,y ^ 2取消,您将得到一个只有一个未知的线性方程:y。解决它!
答案 1 :(得分:4)
新方法。让m
为缺失的数字,r
为重复的数字。通过数组一次,让X
成为XOR
数组条目以及索引1
到n
的结果。然后是X = m XOR r
。特别是,它不是0
。设b
为X
的任何非零位(您只需选择一个,因为X
不是0
,所以存在一个)。通过数组,让Y
成为XOR
数组条目和1
到n
位b
的结果0
Z
{1}}让XOR
成为1
数组条目和n
到b
位1
位Y
的结果Z
{1}}。然后m
和r
持有X
和b
,所以剩下的就是做最后一遍以查看数组中的哪一个。
总空间:4(如果您为Y
重复使用Z
,则为3)
总时间:7次通过(如果您在阵列的同时进行索引并同时计算O(1)
和O(n)
,则为3次。
因此{{1}}空格和{{1}}时间。
答案 2 :(得分:1)
我们可以在O(n)和恒定空间中进行:
index = Math.abs(a[i]) - 1
index
处的值
index+1
)作为答案,因为这意味着我们之前已经看过这个索引。“”
static int findDup(int[] a){
for(int i=0;i<a.length;i++){
int index = Math.abs(a[i]) - 1;
if(a[index] < 0)
return index+1;
else
a[index] = -1 * a[index];
}
return -1;
}
答案 3 :(得分:-1)
计算所有整数的总和 计算int p = sum%100 100 - p就是答案