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