题目

题目来源:力扣(LeetCode)

image.png

思路分析

每次选择剩余木棒中费用最少的两根进行连接,其实就是哈弗曼树权值求和的问题。求哈夫曼权值和,我们可以借助数组来做,不过最方便的还是借助优先队列。

  • 首先将所有权值push进优先队列
  • 循环遍历队列,每次取出队列两个最小值求和,同时将两个值的和push进队列,直到队列为空
  • 结束循环,返回结果最小花费
  1. /**
  2. * @param {number[]} sticks
  3. * @return {number}
  4. */
  5. // dequeue是按照进⼊队列的先后顺序来取出元素。
  6. // 在堆中,我们不是按照元素进⼊队列的先后顺序取出元素的,⽽是按照元素的优先级取出元素
  7. var connectSticks = function (sticks) {
  8. let ans = 0;
  9. let p = new MinPriorityQueue();
  10. for (const x of sticks) {
  11. p.enqueue(x, x);
  12. }
  13. while (p.size() > 1) {
  14. let a = p.dequeue().element;
  15. a += p.dequeue().element;
  16. ans += a;
  17. p.enqueue(a, a);
  18. }
  19. return ans;
  20. };