foo
得到作为参数具有不同数目一个排序的列表,并返回所有出现的计数的方法,使得:i == list[i]
(其中i
是索引0 <= i <= len(list)
)。我的代码更糟的时间复杂度是log(n)吗?
def foo_helper(lst, start, end):
if start > end:
# end of recursion
return 0
if lst[end] < end or lst[start] > start:
# no point checking this part of the list
return 0
# all indexes must be equal to their values
if abs(end - start) == lst[end] - lst[start]:
return end - start + 1
middle = (end + start) // 2
print(lst[start:end+1], start, middle, end)
if lst[middle] == middle:
#print("lst[" , middle , "]=", lst[middle])
return 1 + foo_helper(lst, middle+1, end) + foo_helper(lst, start, middle-1)
elif lst[middle] < middle:
return foo_helper(lst, middle+1, end)
else:
return foo_helper(lst, start, middle-1)
def foo(lst):
return foo_helper(lst, 0, len(lst)-1)
我的问题是,如果这个代码的的最坏情况复杂 =的log(n)?
如果不是,我应该做什么不同?
固定凹槽。 – davidjack
试图让我的头靠近它。想想身份函数的图。我们想知道这个排序列表(一个严格单调函数)与y = x行相交的位置,只考虑整数位置。因为我们有一个有独特元素的排序列表,所以我们有'i == list [i]'在任何地方,在一个地方,或者如果有多个地方,他们必须是连续的(一旦你在线以上,你可以永远不会回落),对吧? – YXD
'lst [start:end + 1]'单独需要Θ(n)时间,但我想这会在最终版本中消失,对吧? –