为了装修新房,你需要加工一些长度为正整数的棒材 sticks。

如果要将长度分别为 X 和 Y 的两根棒材连接在一起,你需要支付 X + Y 的费用。 由于施工需要,你必须将所有棒材连接成一根。

返回你把所有棒材 sticks 连成一根所需要的最低费用。注意你可以任意选择棒材连接的顺序。

  • ​​1≤sticks.length≤10^4
  • ​​1≤sticks[i]≤10^4

在线评测地址:https://www.lintcode.com/problem/minimum-cost-to-connect-sticks/?utm_source=sc-bky-zq

样例 1:

输入:
[,,]
输出:
解释:先将 和 连接成 ,花费 ;再将 和 连接成 ;总花费为

样例 2:

输入:
[,,,]
输出:

【题解】

根据题意,考虑贪心,我们每次将所有棒材的最短的两根合并,将合并后的棒材放入棒材堆,重复合并最短的,直到棒材只剩下一根。

// minheap 暴力
// 直接将所有值压入minheap,每次取前两个值相加成merge,同时将merge压入minheap
public class Solution {
/**
* @param sticks: the length of sticks
* @return: Minimum Cost to Connect Sticks
*/
public int MinimumCost(List<Integer> sticks) {
if (sticks.size() < ) {
return ;
}
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
for (int num : sticks) {
minHeap.add(num);
}
int res = ;
while (minHeap.size() > ) {
int merge = minHeap.poll() + minHeap.poll();
res += merge;
minHeap.add(merge);
}
return res;
}
}
// 排序,双队列
// 先将数组排序,然后开始合并,合并后的值放入q2末尾,能够保证q2中被押入的值是
// 一定大于前面的值的,每次合并我们考虑q1,q2非空以及比较q1[0]和q2[0]的大小
public class Solution {
/**
* @param sticks: the length of sticks
* @return: Minimum Cost to Connect Sticks
*/
public int MinimumCost(List<Integer> sticks) {
Collections.sort(sticks);
Queue<Integer> q1 = new LinkedList<Integer>();
Queue<Integer> q2 = new LinkedList<Integer>();
for (int i : sticks) {
q1.add(i);
}
int res = ,merge;
while(q1.size() + q2.size() > ){
if(q2.isEmpty()){
merge = q1.poll();
merge += q1.poll();
q2.add(merge);
res += merge;
}
else if (q1.isEmpty()){
merge = q2.poll();
merge += q2.poll();
q2.add(merge);
res += merge;
}
else {
if(q1.peek() > q2.peek()){
merge = q2.poll();
}
else {
merge = q1.poll();
} if (q1.isEmpty()){
merge += q2.poll();
q2.add(merge);
res += merge;
}
else if(q2.isEmpty()){
merge += q1.poll();
q2.add(merge);
res += merge;
}
else {
if(q1.peek() > q2.peek()){
merge += q2.poll();
q2.add(merge);
res += merge;
}
else {
merge += q1.poll();
q2.add(merge);
res += merge;
}
}
}
}
return res;
}
}

更多题解参见:https://www.jiuzhang.com/solution/minimum-cost-to-connect-sticks/?utm_source=sc-bky-zq

[leetcode/lintcode 题解] Amazon面试题:连接棒材的最低费用的更多相关文章

  1. [leetcode/lintcode 题解] 谷歌面试题:找出有向图中的弱连通分量

    请找出有向图中弱连通分量.图中的每个节点包含 1 个标签和1 个相邻节点列表.(有向图的弱连通分量是任意两点均有有向边相连的极大子图) 将连通分量内的元素升序排列. 在线评测地址:https://ww ...

  2. [leetcode/lintcode 题解] 微软面试题:股票价格跨度

    编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度. 今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天). 例如 ...

  3. [leetcode/lintcode 题解] Google面试题:合法组合

    给一个单词s,和一个字符串集合str.这个单词每次去掉一个字母,直到剩下最后一个字母.求验证是否存在一种删除的顺序,这个顺序下所有的单词都在str中.例如单词是’abc’,字符串集合是{‘a’,’ab ...

  4. [leetcode/lintcode 题解] 微软面试题:公平索引

    现在给你两个长度均为N的整数数组 A 和 B. 当(A[0]+...A[K-1]),(A[K]+...+A[N-1]),(B[0]+...+B[K-1]) 和 (B[K]+...+B[N-1])四个和 ...

  5. [leetcode/lintcode 题解] 微软 面试题:实现 Trie(前缀树)

    实现一个 Trie,包含 ​insert​, ​search​, 和 ​startsWith​ 这三个方法.   在线评测地址:领扣题库官网     样例 1: 输入:    insert(" ...

  6. leetcode & lintcode 题解

    刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...

  7. [leetcode/lintcode 题解] 一致性哈希 II · Consistent Hashing II

    [题目描述] 在 Consistent Hashing I 中我们介绍了一个比较简单的一致性哈希算法,这个简单的版本有两个缺陷: 增加一台机器之后,数据全部从其中一台机器过来,这一台机器的读负载过大, ...

  8. 【LeetCode/LintCode 题解】约瑟夫问题 · Joseph Problem

    n个人按顺序围成一圈(编号为1~n),从第1个人从1开始报数,报到k的人出列,相邻的下个人重新从1开始报数,报到k的人出列,重复这个过程,直到队伍中只有1个人为止,这就是约瑟夫问题.现在给定n和k,你 ...

  9. [leetcode/lintcode 题解] 前序遍历和中序遍历树构造二叉树

    [题目描述] 根据前序遍历和中序遍历树构造二叉树. 在线评测地址: https://www.jiuzhang.com/solution/construct-binary-tree-from-preor ...

随机推荐

  1. 微信小程序预览Word文档

    <view data-url="https://xxxcom/attachment/word.docx" data-type="docx" catchta ...

  2. 关于idea的一些快捷键

    最近在用idea写代码,熟悉一些快捷键的使用能够让写代码的速度提高,以下快捷键是默认idea的快捷键,当然我们可以自己修改的: 自动补全代码快捷键:CTRL+alt+V 自动格式化代码:CTRL+al ...

  3. vs code 初始化vue项目框架

    1.首先安装npm组件  下载地址:https://nodejs.org/en/ 安装完 2.配置环境变量 3.验证是否成功 node -v npm -v 4.替换npm 输入npm install ...

  4. Maven搭建Spring MVC

    Maven搭建SpringMVC 点击Enable Auto Import 下面配置文件 配置两个文件 web.app-->Web-INF--web.xml <!DOCTYPE web-a ...

  5. python计算矩阵均匀分布程度

    计算N×M(建议维度大于100*100)的0,1矩阵均匀分布程度,值由0到1表示不均匀到均匀 import numpy as np def make_rand_matrix(side=20): # 制 ...

  6. 03 . Shell数组和函数

    Shell数组 简介 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. S ...

  7. MysqlException: max pool size was reached.

    2019-09-09 08:22:08.620 +00:00 [ERR] Connection id "0HLPKVK52H2OU", Request id "0HLPK ...

  8. html中为何经常使用<i>标签来作为小图标呢?

    很多网站都是习惯使用<i></i>来代表小图标?而实际上用 <i> 元素做图标在语义上是不正确的(虽然看起来像 icon 的缩写),那么用<i>表示小i ...

  9. LoadLibraryA与GetProcAddress介绍

    0x00 函数原型 HMODULE LoadLibraryA(     LPCTSTR lpLibFileName//模块的的的名字 ) FARPROC GetProcAddress( HMODULE ...

  10. Vue防止按钮重复提交

    参考了:https://www.cnblogs.com/adbg/p/11271237.html 方法:使用全局指令的方式. 一.新建指令 1.我们首先新建一个js文件,例如起名为plugins.js ...