【问题标题】:Reducing the execution time in following program减少以下程序的执行时间
【发布时间】: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


【解决方案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++)
    {
        if (seen[a[i]] == a[i] * -1)
            dupIndex = a[i];
        else
            seen[a[i]] = a[i] * -1;
    }

    return dupIndex;
}

【讨论】:

    【解决方案2】:

    第一个(天真的)优化:在i+1 开始内循环。

    第二个(也很幼稚,因为它使用了很多内存)优化:分配一个长度为a.length的数组,初始化为-1。然后,遍历您的数据一次,一旦找到一个数字,就存储它的索引。如果已经找到索引,您可以通过检查 -1 来检测它,并且您有您的副本。

    【讨论】:

    • 存在 O(n) 算法,这些输入数据具有 O(1) 额外内存。只是它修改了输入数组,我们不知道是否允许。但似乎如此,因为输入向量是按值传递给函数的。 (顺便说一句,不是我的反对票。不知道为什么有人不加评论地反对票。)
    • 确实存在。但写下来并非易事。我的目的不是给出最佳答案,只是指出发布者可以采取哪些简单的措施来改善他的运行时间。我不介意投反对票,但如果原因是我没有给出最优算法,我强烈不同意这个推理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 2021-07-09
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多