更快的算法在两个数组之间找到唯一元素?编辑:
编辑:对于任何对这个问题不熟悉的人,我已经发布了一个答案,澄清了发生了什么。被接受的答案是我觉得最好回答我最初发布的问题的答案,但有关更多详细信息,请参阅我的答案。
注意:此问题最初是伪代码和使用的列表。我已经将其改编为Java和数组。因此,虽然我很想看到任何使用Java特定技巧的解决方案(或任何语言的技巧!),但请记住,最初的问题是与语言无关的。
问题
假设有两个未排序的整数数组和 ,允许元素重复。它们是相同的(相对于包含的元素),除了其中一个数组具有额外的元素。例如:a
b
int[] a = {6, 5, 6, 3, 4, 2};
int[] b = {5, 7, 6, 6, 2, 3, 4};
设计一种算法,将这两个数组作为输入并输出单个唯一整数(在上面的例子中为7)。
解决方案(到目前为止)
我想出了这个:
public static int getUniqueElement(int[] a, int[] b) {
int ret = 0;
for (int i = 0; i < a.length; i++) {
ret ^= a[i];
}
for (int i = 0; i < b.length; i++) {
ret ^= b[i];
}
return ret;
}
课堂上展示的“官方”解决方案:
public static int getUniqueElement(int[] a, int[] b) {
int ret = 0;
for (int i = 0; i < a.length; i++) {
ret += a[i];
}
for (int i = 0; i < b.length; i++) {
ret -= b[i];
}
return Math.abs(ret);
}
因此,两者在概念上都在做同样的事情。给定长度为 m 且长度为 n,则两种解的运行时间为 O(m + n)。a
b
问题
后来我和我的老师聊了聊,他暗示有一种更快的方法可以做到这一点。老实说,我不明白如何;要找出一个元素是否唯一,似乎你至少必须查看每个元素。至少是O(m + n)...右?
那么有没有更快的方法呢?如果是这样,它是什么?