【发布时间】:2018-12-28 22:02:35
【问题描述】:
我正在解决 CodeLab 上的一个问题,该问题要求在适当的位置删除重复项,以便每个元素最多可以出现两次并返回新的长度。
给定输入数组 A = [1,1,1,2] 您的函数应该返回长度 = 3,而 A 现在是 [1,1,2]
我的 Python 代码运行良好且正确,但运行时间(时间复杂度)太长。但是当我运行类似的 Java 代码(一个循环)时,它会接受它。我在 Python 代码中做错了什么以至于时间太多了?
def removeDuplicates(A):
if len(A) <= 2:
return len(A)
i = 0
n = len(A)
while i < n:
if i <= len(A)-3:
if A[i] == A[i+1] and A[i] == A[i+2]:
del A[i]
i -= 1
i += 1
return i
Java 代码:
public int removeDuplicates(ArrayList<Integer> a) {
int count = 1;
int shiftLeft = 0;
int i = 1;
while (i < a.size()){
a.set(i-shiftLeft, a.get(i));
if (a.get(i-1-shiftLeft).equals(a.get(i))){
count ++;
}
else {
count = 1;
}
if (count == 3){
shiftLeft ++;
count --;
}
i ++;
}
for (int j=0; j<shiftLeft; j++){
a.remove(a.size()-1);
}
return a.size();
}
【问题讨论】:
-
请修复python格式。缩进比 Java 更重要
-
只是猜测:
del A[i]的复杂度为 O(n-i)。在 Java 中,您只需调用a.remove(a.size()-1)即可删除最后一个元素。 (大约 O(1))。 -
我不明白 python 代码是如何工作的。您不会在循环中重新计算
n。这肯定会引发索引错误? -
@MichaelButscher 谢谢迈克尔。但是由于索引(i)处的指针,它仍然需要O(n-1)吗?
-
del A[i]必须将所有列表元素从i之后的一个索引向后移动到最后一个索引。在 Python 中,这些元素只是指针(也称为引用),但复杂性仍然是线性的。
标签: python python-3.x performance time-complexity