我寫了一個廣義的解決方案(您指定k
)使用額外的參數與默認值跟蹤到目前爲止發現的最小集合k
,以及這是最高級別的遞歸還是子級別。子級返回當前最小的子集,頂級返回最後一個條目(即最小值)。使用heapq
的nsmallest
方法維護最小的一組k
。
import heapq
def find_kth_smallest(k, a_list, smallest_k = [], top_level = True):
l = len(a_list)
if l > 1:
l /= 2
smallest_k = find_kth_smallest(k, a_list[:l], smallest_k, False)
smallest_k = find_kth_smallest(k, a_list[l:], smallest_k, False)
elif l < 1:
return []
else:
if isinstance(a_list[0], list):
smallest_k = find_kth_smallest(k, a_list[0], smallest_k, False)
else:
smallest_k.append(a_list[0])
smallest_k = heapq.nsmallest(k, smallest_k)
if top_level:
return smallest_k[-1]
else:
return smallest_k
print find_kth_smallest(3, [10, [9, 8, [[]]], [7, 6, [[5], 4, 3]], 2, 1]) # => 3
來源
2016-02-23 00:25:25
pjs
你的家庭作業任務要求你在二叉搜索樹中找到第k個最大的數字嗎? – inspectorG4dget