【问题标题】:Leetcode 27. Remove Element: Execution time for the same submission differs drasticallyLeetcode 27. 删除元素:相同提交的执行时间差异很大
【发布时间】:2020-09-26 12:22:56
【问题描述】:

Leetcode problem:

给定一个数组 nums 和一个值 val,删除它的所有实例 就地取值并返回新的长度。

不要为另一个数组分配额外的空间,你必须这样做 使用 O(1) 额外内存就地修改输入数组。

元素的顺序可以改变。你离开什么都没关系 超出新长度。

示例 1:

给定 nums = [3,2,2,3], val = 3,

您的函数应返回长度 = 2,前两个元素为 nums 为 2。

您在返回的长度之外留下什么并不重要。例子 2:

给定 nums = [0,1,2,2,3,0,4,2],val = 2,

您的函数应返回长度 = 5,前五个元素 包含 0、1、3、0 和 4 的 nums。

请注意,这五个元素的顺序可以是任意的。

设置超出返回长度的值无关紧要。 澄清:

困惑为什么返回的值是一个整数,但你的答案是 数组?

注意输入数组是通过引用传入的,也就是说 调用者也将知道对输入数组的修改。

在内部你可以这样想:

// nums 通过引用传入。 (即,不复制) int len = removeElement(nums, val);

// 对函数中 nums 的任何修改都会被 呼叫者。 // 使用你的函数返回的长度,它打印 第一个 len 元素。 for (int i = 0; i

我的回答

int removeDuplicates(std::vector<int>& nums) {
    if (nums.empty()) { return 0; }
    int end = nums.size() - 1;
    int curr_val = nums[end];
    for (; end > 0; end--){
        if(curr_val == nums[end - 1]){ // there is duplicate before this value (curr_val)
            nums.erase(nums.begin() + end - 1); // remove the duplicate at the particular index
        } else {
            curr_val = nums[end - 1];
        }
    }

    return nums.size();
}

我的执行时间

我提交了相同的答案five 次,执行时间从最开始的8ms4ms,然后到0ms。为什么执行时间如此不一致?和 Leetcode 平台有关系吗?

【问题讨论】:

  • 在他们(Leetcode 的)服务器上执行。这似乎很好。他们的服务器中可能还有其他正在运行的进程,并且可能还有其他几个可能的原因。所以,是的,这是完全正常的。您是否曾经在本地尝试过,您也会在您的计算机上看到不同之处?试试time ./&lt;executable&gt;
  • 其他leetcode用户have reported the same观察。除了说“是的,它可能是平台”之外,我不确定如何在 SO 上回答这个问题。
  • 请注意,您的算法具有二次时间复杂度。
  • 显示的代码有很大的改进空间。这里最有效的解决方案不会使用erase(),并且每次删除重复值时都会调用erase(),这是非常低效的。正确的解决方案不会使用erase(),而是只使用一个for 循环,该循环遍历数组一次,然后是resize()。如果你认真想获得良好的 C++ 技能,我希望每一本好的 C++ 教科书都会讨论这些技术,而不是像“leetcode”这样的网站。
  • 代码在未知环境中运行,其他未知数量的工作并行运行,并且每次都可能在不同的硬件上运行,每次运行需要不同的时间; 11 点的新闻。为什么这令人惊讶?

标签: c++ big-o


【解决方案1】:

LeetCode 并未声称为运行您的程序提供封闭且一致的环境。你可以想象他们可能有成百上千台机器在上面运行提交。其中一些可能是五年前购买的,一些是全新的,一些暂时运行的提交比其他的多,等等。可能存在某种关联机制,在用于首先,可能避免一些初始化开销。我个人注意到 JavaScript 提交在第一次提交后往往会运行得更快,即使没有任何更改。在评估提交的性能时,较少关注绝对运行时间,而更多地关注相对于其他提交的运行时间。如果你正在为面试练习,相对运行时间会告诉你,你是否在大 O 术语中得到了正确的算法。如果你比其他提交慢很多,那么你可能使用了错误的方法。在您的情况下,您的运行时间非常棒,因此请考虑完成并继续前进!

【讨论】:

  • 在为可以在线性时间内解决的问题编写二次时间算法之后继续前进?
  • 问题是关于 LeetCode 平台,而不是这个特定的解决方案。
  • 另请注意,报告时间的提交不是问题顶部包含的OP。
  • 感谢您的所有回答!感谢@Evg 指出运行时问题。二次方其实是我对这个问题的第一个答案,图片中的那个是我的第二个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
相关资源
最近更新 更多