1872. 连接棒材的最低费用
中文English
为了装修新房,你需要加工一些长度为正整数的棒材 sticks。
如果要将长度分别为 X 和 Y 的两根棒材连接在一起,你需要支付 X + Y 的费用。 由于施工需要,你必须将所有棒材连接成一根。
返回你把所有棒材 sticks 连成一根所需要的最低费用。注意你可以任意选择棒材连接的顺序
样例
样例 1:
输入:
[2,4,3]
输出:14
解释:先将 2 和 3 连接成 5,花费 5;再将 5 和 4 连接成 9;总花费为 14
样例 2:
输入:
[1,8,3,5]
输出:30
注意事项
- 1 leq sticks.length leq 10^41≤sticks.length≤104
- 1 leq sticks[i] leq 10^41≤sticks[i]≤104
heapq 堆队列
import heapq class Solution: """ @param sticks: the length of sticks @return: Minimum Cost to Connect Sticks """ def MinimumCost(self, sticks): # write your code here if not sticks: return 0 #将list sticks原地转化为堆,线性时间内 heapq.heapify(sticks) cost, length = 0, len(sticks) for i in range(length - 1): num1, num2 = heapq.heappop(sticks), heapq.heappop(sticks) cost += num1 + num2 heapq.heappush(sticks, num1 + num2) return cost
PirortityQueue 优先队列
import queue class Solution: """ @param sticks: the length of sticks @return: Minimum Cost to Connect Sticks """ def MinimumCost(self, sticks): # write your code here if not sticks: return 0 array = [] cost = 0 #优先队列 minqueue = queue.PriorityQueue() #所有的值丢尽minqueue里面 for val in sticks: minqueue.put(val) while minqueue.qsize() > 1: #每次get出最小的值出来,然后在put到minqueue里面 total = minqueue.get() + minqueue.get() cost += total minqueue.put(total) return cost