当前位置 博文首页 > 文章内容

    [leetcode/lintcode 题解] Amazon面试题:连接棒材的最低费用

    作者: 栏目:未分类 时间:2020-07-22 16:01:04

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    为了装修新房,你需要加工一些长度为正整数的棒材 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,4,3]
    输出:14
    解释:先将 23 连接成 5,花费 5;再将 54 连接成 9;总花费为 14

    样例 2:

    输入:
     [1,8,3,5]
    输出:30

    【题解】

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

    // 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() < 2) {
                return 0;
            }
            PriorityQueue<Integer> minHeap = new PriorityQueue<>();
            for (int num : sticks) {
                minHeap.add(num);
            }
            int res = 0;
            while (minHeap.size() > 1) {
                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 = 0,merge;
            while(q1.size() + q2.size() > 1){
                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