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)時間,但我想這會在最終版本中消失,對吧? –