我正在研究堆,并在hackarank中尝试了一个问题。
问题是要在列表中找到达到某个值K所需的次数。如果任何值小于K:则将添加前两个最小值,并放置新值而不是这两个值。
我已经完成了解决方案的编码。但是,请说明我可以做的任何改进以使代码运行更快。
我的代码:
import heapq as heap
data = map (int, raw_input ().strip ().split ())
N, K = data [0], data [1]
cookies = map (int, raw_input ().strip ().split ())
heap.heapify (cookies)
numOps = 0
possibility = False
while cookies [0] < K:
if N == 1:
possibility = True
break
leastSweetCookies = heap.nsmallest (2, cookies)
heap.heapreplace (cookies, leastSweetCookies [0] + 2 * leastSweetCookies [1])
heap.heappop (cookies)
numOps += 1
N -= 1
if possibility == False: print numOps
else: print -1
答案 0 :(得分:0)
这三行:
leastSweetCookies = heap.nsmallest (2, cookies)
heap.heapreplace (cookies, leastSweetCookies [0] + 2 * leastSweetCookies [1])
heap.heappop (cookies)
等同于:
sw1 = heap.heappop(cookies);
sw2 = heap.heappop(cookies);
heap.heappush(cookies, sw1 + 2*sw2);
在您的代码中,对nsmallest
的调用可能会遍历整个堆以找到2个最小的项。然后是替换顶部元素的O(log n),弹出最小元素的O(log n)。
在替换代码中,两个弹出窗口的每一个均为O(log n),而推送则为O(log n)。所以:
您的代码:O(n)+ O(log n)+ O(log n)
我的代码:O(log n)+ O(log n)+ O(log n)