【发布时间】:2020-12-29 05:58:31
【问题描述】:
我正在尝试首先解决编程问题Duplicate on codesignal。问题是“给定一个数组a,它只包含1 到a.length 范围内的数字,找到第二次出现的索引最小的第一个重复数字”。
示例:对于a = [2, 1, 3, 5, 3, 2],输出应为firstDuplicate(a) = 3
有 2 个重复项:数字 2 和 3。第二次出现的 3 比第二次出现的 2 的索引更小,所以答案是 3。
使用此代码,我通过了 21/23 测试,但随后它告诉我程序超出了测试 22 的执行时间限制。我该如何让它更快,以便它通过剩余的两个测试?
#include <algorithm>
int firstDuplicate(vector<int> a) {
vector<int> seen;
for (size_t i = 0; i < a.size(); ++i){
if (std::find(seen.begin(), seen.end(), a[i]) != seen.end()){
return a[i];
}else{
seen.push_back(a[i]);
}
}
if (seen == a){
return -1;
}
}
【问题讨论】:
-
使用哈希图代替向量
-
阅读好的C++ programming book 以及编译器(例如GCC...)和调试器(例如GDB)的文档。见this C++ reference。使用the Clang static analyzer 和gprof(1)。见time(7)
-
从现有开源 C++ 软件中汲取灵感,例如fish、RefPerSys、Qt、FLTK。考虑使用一些C++ container
-
无论语言如何,答案都是一样的。在 Java 中,我不得不使用
HashMap和HashSet而不是多次迭代数组。
标签: c++ execution-time