我有一个N个元素的数组,包含1到(N-1)个整数 - 从1到最大数N-1的整数序列,这意味着只有一个数字被重复,我想要为了编写一个返回这个重复元素的算法,我找到了一个解决方案,但它只能在数组排序时才能工作,但情况可能并非如此。 ?
int i=0;
while(i<A[i])
{
i++
}
int rep = A[i];
答案 0 :(得分:1)
我不知道为什么RC取消了他的评论,但他的想法很好。
凭借N的知识,你可以轻松计算出[1:N-1]的总和。然后总结阵列中的所有元素并减去上面的总和,你就得到了你的数字。
这是以O(n)为代价的,并没有打败。
然而,这仅适用于您提到的前提条件。
更通用的方法是对数组进行排序,然后简单地遍历它。这将是O(n log(n))并且仍然比你的O(n²)好。
我知道您可以创建查找表并使用全零启动它的最大数量,遍历数组并检查一个并用一个标记条目。复杂性也只是O(n),但却以记忆为代价。
如果值范围未知,可以使用simiar方法,但不能使用查找表,而是可以使用哈希集。
答案 1 :(得分:0)
线性搜索将帮助您处理复杂度O(n):
final int n = ...;
final int a[] = createInput(n); // Expect each a[i] < n && a[i] >= 0
final int b[] = new int[n];
for (int i = 0; i < n; i++)
b[i]++;
for (int i = 0; i < n; i++)
if (b[i] >= 2)
return a[i];
throw new IllegalArgumentException("No duplicates found");
答案 2 :(得分:0)
一种可能的解决方案是对数组中的所有元素求和,然后计算最大为N-1的整数的sym。之后减去这两个值并瞧 - 你找到了你的号码。这是vlad_tepesch提出的解决方案,它很好,但有一个缺点 - 你可能会溢出整数类型。为避免这种情况,您可以使用64位整数。
但是我想提出一个小修改 - 计算直到N-1的整数的xor和(即计算1 ^ 2 ^ 3 ^ ...(N-1))并计算你的xor总和数组(即 0 ^ a 1 ^ ... a N-1 )。在那之后,两个值和结果将是重复的元素。