此问题是由另一个堆栈溢出问题-How do I improve remove duplicate algorithm?引起的
问题中张贴的要求是-
need to return the length of an array that removed duplicates but we can leave at most 2 duplicates.
示例-[1,1,1,2,2,3],新数组将是[1,1,2,2,3].因此,新长度为5.
OP给出的解决方案-
def removeDuplicates(nums):
if nums is None:
return 0
if len(nums) == 0:
return 0
if len(nums) == 1:
return 1
new_array = {}
for num in nums:
new_array[num] = new_array.get(num, 0) + 1
new_length = 0
for key in new_array:
if new_array[key] > 2:
new_length = new_length + 2
else:
new_length = new_length + new_array[key]
return new_length
我尝试提出一种将循环数量减少到单个循环的解决方案.
def removeDuplicates1(nums):
if nums is None:
return 0
if len(nums) == 0:
return 0
if len(nums) == 1:
return 1
new_array = {}
length = 0
for num in nums:
n = new_array.get(num, 0)
new_array[num] = n + 1
if n <= 1:
length += 1
return length
之后,我尝试对解决方案与原始解决方案进行计时,我认为我的解决方案应该对原始解决方案进行了至少一点改进,但??是timeit的结果表明原始解决方案总是更好(即使数组包含所有独特元素).采取的时间-
In [3]: l = list(range(1000))
In [4]: %timeit removeDuplicates(l)
1000 loops, best of 3: 390 s per loop
In [5]: %timeit removeDuplicates1(l)
1000 loops, best of 3: 412 s per loop
In [6]: l1 = [1] * 1000
In [7]: %timeit removeDuplicates(l1)
1000 loops, best of 3: 224 s per loop
In [9]: %timeit removeDuplicates1(l1)
1000 loops, best of 3: 304 s per loop
有人可以建议为什么会这样吗?我是否忽略了明显的东西?