1167. 連接棒材的最低費用

題目描述

爲了裝修新房,你需要加工一些長度爲正整數的棒材 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章