我在接受采访时被问到,在 n 元素数组中找到副本的最短或最快方法是什么,可以是整数或浮点数。虽然在堆栈溢出中搜索,特别是python使用的解决方案,但是如果我想在某些编程语言(如C或C ++)中实现相同的,我可以使用什么算法,或者我有什么方法可以在O中执行它(N)?
答案 0 :(得分:3)
虽然它可能不是最节省空间的算法,但您可以使用散列映射来存储遍历数组时遇到的每个值(键)。然后,对于数组中的每个步骤,您将在哈希表中执行O(1)查找,以查看您之前是否已看到此值。此解决方案是O(N),因为您只遍历大小为N的数组一次,并且在每一步中都执行O(1)哈希查找。
这是C ++中实现此方法的方法:
#include <map>
bool hasDupicate(int* input, int size) {
std::map<int, int> m;
for (int i=0; i < size; ++i) {
if (m.find(input[i]) != m.end()) {
return true;
} else {
// record the element you just saw in the map
m.insert(std::pair<int, int>(input[i], 1));
}
}
// could not find any duplicate
return false;
}
答案 1 :(得分:1)
由于蒂姆询问有关排序的解决方案,这里是
bool hasDuplicate(std::vector<int> & input)
{
std::sort(input.begin(), input.end());
return std::adjacent_find(input.begin(), input.end()) != input.end();
}
int main() {
std::vector<int> A { 2, 4, 9, 3, 8, 4, 5, 1 };
std::cout << hasDuplicate(A) ? "has duplicates" : "no duplicates";
return 0;
}
它具有时间复杂度O(n log n)并重新排序输入序列的元素,但不需要额外的内存分配,因此在许多实际情况下,它可能比使用散列表的渐近更快的O(n)算法更快以上是蒂姆。