題目描述
爲了裝修新房,你需要加工一些長度爲正整數的棒材 sticks。
如果要將長度分別爲 X 和 Y 的兩根棒材連接在一起,你需要支付 X + Y 的費用。 由於施工需要,你必須將所有棒材連接成一根。
返回你把所有棒材 sticks 連成一根所需要的最低費用。注意你可以任意選擇棒材連接的順序。
示例 1:
輸入:sticks = [2,4,3]
輸出:14
解釋:先將 2 和 3 連接成 5,花費 5;再將 5 和 4 連接成 9;總花費爲 14。
示例 2:
輸入:sticks = [1,8,3,5]
輸出:30
提示:
1 <= sticks.length <= 10^4
1 <= sticks[i] <= 10^4
思路
每次選擇剩餘木棒中費用最少的兩根進行連接,其實就是哈弗曼樹權值求和的問題。求哈夫曼權值和,我們可以藉助數組來做,不過最方便的還是藉助優先隊列。
- 首先將所有權值push進優先隊列
- 循環遍歷隊列,每次取出隊列兩個最小值求和,同時將兩個值的和push進隊列,直到隊列爲空
- 結束循環,返回結果最小花費
具體代碼
class Solution {
public:
priority_queue<int, vector<int>, greater<int>> Q;
int connectSticks(vector<int>& sticks) {
long long res = 0;
for(int i = 0; i < sticks.size(); i++) {
Q.push(sticks[i]);
}
while(Q.size()>1){
int a, b;
a = Q.top();
Q.pop();
b = Q.top();
Q.pop();
res += (a + b);
Q.push(a + b);
}
return res;
}
};