如果我有一个n长度唯一值的数组,除了一个重复的值,找到它的最快方法是什么?
e.g。 [1,2,3,4,4,10,15,12]最快找到它的方法4.可能有数百万个数组元素。
答案 0 :(得分:1)
如果您有可能使用数据结构,则可以在CONSTANT时间内完成。即大约O(1)。那是使用HashMap。 (当我们处理数百万的数字时)
你也可以使用一个单独的数组说(Dummy),大小为max(数组中存在的元素),然后继续将元素放在Dummy [element]中,无论你在哪里找到元素已经存在,你都可以实现所需的结果。它也需要O(n)复杂度。
答案 1 :(得分:1)
你必须逐个浏览数组的所有元素。如果没有更多信息,则无法在不触及每个元素至少一次的情况下找到重复元素。这至少是O(N)
,你不能走得更快。
如果重复的元素是连续的,例如[1,2,2,3],你可以一个接一个地将它与前一个元素进行比较;如果它们相等,你就找到了你的元素:
for (int i = 1; i < count; i++) {
if (arr[i] == arr[i-1]) {
std::cout << "found " << arr[i] << " at " << i << " and " << (i-1) << std::endl;
break;
}
}
如果重复的元素不连续,您可以使用数据结构来跟踪现有元素。当您找到一个已经看过的元素时,您会通知该元素:
initialize set to empty set;
for (i = 0; i < count; i++) {
if (arr[i] is in set) {
inform arr[i] as repeated element at position i;
break;
} else {
add arr[i] to set;
}
}
答案 2 :(得分:0)
如果副本处于一个完全随机的位置,我无论如何都要看到1对1检查,直到你找到副本,此时你显然会停止。