【发布时间】:2018-02-27 13:07:46
【问题描述】:
我需要在不超过时间限制的情况下优化我对以下问题的回答 (0.5s)。这不是作业,也不是比赛,也不是我的面试问题。我目前正在自学编程为了好玩,我在网上找到了这个。
给定一个数组 a,它只包含从 1 到 a.length 范围内的数字,找到第二次出现的具有最小索引的第一个重复数字。换句话说,如果有超过 1 个重复的数字,则返回第二次出现的索引比另一个数字的第二次出现的索引更小的数字。如果没有这样的元素,返回-1。
这是我的回答:
int firstDuplicate(std::vector<int> a)
{
int arrLen = a.size();
int dupIndex = -1;
int seen[arrLen];
for (int i = 0; i < arrLen; i++)
seen[i] = 0;
for (int i = 0; i < arrLen && dupIndex == -1; i++)
{
for (int j = 0; j < arrLen && dupIndex == -1 && seen[j] != 0; j++)
if (a[i] == seen[j])
dupIndex = seen[j];
seen[i] = a[i];
}
return dupIndex;
}
[输入] array.integer a
保证约束:
1 ≤ a.length ≤ 105,
1 ≤ a[i] ≤ a.length
我应该如何优化我的代码以及程序优化的因素是什么? (是的,我是编程新手)
【问题讨论】:
-
提示:你的算法是 O(N * N)。您可以在 O(N) 中完成此操作。
-
解释@Bathsheba 的意思——最坏的情况是,您目前为数组中的每个元素迭代整个数组一次。您可以更改此设置,以便在最坏的情况下只检查一次阵列。 SO用户往往不喜欢直接回答比赛/家庭作业,因为它违背了他们的意义......
-
@UKMonkey:另外写出这个 O(N) 解决方案真是太麻烦了。
-
闻起来像“自己做作业”...
-
@Bathsheba 但那些最有趣的不是最有趣的吗? ;)
标签: c++ optimization time-complexity