1167. Minimum Cost to Connect Sticks
1167. Minimum Cost to Connect Sticks
這個題目的要求是說,每次要兩兩地把兩個木棍黏在一起,目標是要把所有的木棍黏在一起,不過每次黏的時候,木棍的長度會是他的成本,要求最小成本。
根據題目的敘述,我們可以推斷出每次黏和任兩根,卻要要求成本最短,那一定是要先把短的黏合成長的,因為如果先黏合長的,長的成本將會一直保留在後續的黏合行為裡。
基於上面的邏輯,我們也知道會有不斷的排序的情況,例如兩個短的可能一粘合後面的很長,就要先選擇其他較短的木棍來黏合,所以我們可以知道一定不是要靠先排序好來解決問題,要在挑選最大最小值,最快的情況就是使用 heap 來快速的查找。
每次先選出兩根組合後,再把組合好的木棍放回 heap 裡面,直到只剩下一根木頭為止。
時間複雜度為 \(O(nlogn)\)。
class Solution:
def connectSticks(self, sticks: List[int]) -> int:
heapq.heapify(sticks)
totalCost = 0
while len(sticks) > 1:
first = heapq.heappop(sticks)
second = heapq.heappop(sticks)
cost = first + second
heapq.heappush(sticks, cost)
totalCost += cost
return totalCost