这个问题是受到了另一个Stack Overflow的问题启发而产生的-如何改进去重算法?
问题中提出的要求是:
需要返回一个已删除重复项但最多只能保留2个副本的数组的长度。
例如-
OP提供的解决方案是-
需要返回一个已删除重复项但最多只能保留2个副本的数组的长度。
例如-
[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
请问有人能解释一下为什么会出现这种情况吗?我是否忽略了什么显而易见的问题?
new_array
不是一个数组,它是一个dict
-- 另一个线程的 OP 命名不好 :/ - a p。其中
rD2()`是我为您的方法定义的函数。 - Sharon Dwilif K