该函数使用int列表并按递增顺序生成列表中的唯一元素。例如:
singles([4,1,4,17,1]) => [1,4,17]
我只能在O(n ^ 2)运行时间内完成它,并想知道如何在没有循环的情况下更改为O(n)运行时间。
def singles(lst):
if lst==[]: return []
else:
rest_fn = list (filter (lambda x: x!=lst[0], lst[1:]))
return [lst[0]] + singles(rest_fn)
答案 0 :(得分:2)
如上所述,每https://wiki.python.org/moin/TimeComplexity(从Time complexity of python set operations?引用,它也链接到更详细的操作列表,已排序应具有时间复杂度O(nlogn)。设置应具有时间复杂度O (n)。因此,做sorted(set(input))
应该有时间复杂度O(n)+ O(nlogn)= O(nlogn)
编辑: 如果你不能使用set,你应该提一下,但作为一个提示,假设你可以使用sorted,你仍然可以在O(n)中取出uniques如果你使用deque(其中O(1)最差案件插入)。像
这样的东西rez = deque()
last = None
for val in sorted(input):
if val != last:
rez.add(val) # or whatever deque uses to add to the end of the list
last = val