暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据结构和算法【93】分金条的最小花费

皮皮克克 2023-12-08
47

点击关注公众号,干货第一时间送达


这道题其实挺经典的,

但是,我在力扣上没有找到原题

可能是关键词搜索有问题,

如果有小伙伴找到,

可以私信告诉我

一起来看看。


一、屏幕前的吴彦祖和刘亦菲们,请听题


题目说的稍微有点费解

举个例子:

有多种分割方案:

(1)先分成【40,20】,再分成【10,30,20】,总花费:60+40=100

(2)先分成【10,50】,再分割成【10,20,30】,总花费:60+50=110

(3)先分成【30,30】,再分割成【10,20,30】,总花费60+30=90


最少花费是第三种方案,90

懂了?

怎么求解呢?


二、解题

求解呢,需要用到贪心策略,

我们不能用总长度去尝试分割,

要倒推,

用数组 arr,每次利用最小的两个值,算作一次分割策略,

然后将组成的一块大金条,重新放回数组,排序。

下次还是取最小的两个值。

类似于哈夫曼编码:

每次取最小的两个值,可以利用小根堆自动实现,

将取出的两个值累加,结果再次放回堆中。

依次类推,最后的结果就是最小花费。

看看代码。



完整代码:

public class CodingDemo_03 {

    /**
     * 分金条的最小花费
     * @param arr
     * @return
     */

    private static int getMinSplitCost(int[] arr){
        if (arr == null || arr.length == 0){
            return 0;
        }

        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        for (int i = 0; i < arr.length; i++) {
            minHeap.offer(arr[i]);
        }

        int ans = 0;
        while (minHeap.size() != 1){
            int sum = minHeap.poll() + minHeap.poll();
            ans += sum;
            minHeap.offer(ans);
        }
        return ans;
    }

    public static void main(String[] args) {

        int[] arr = {10,30,20};
        System.out.println(getMinSplitCost(arr));
    }
}

输出:

D:\java\bin\java.exe
90



结束语:
Ok,就是本篇文章的全部内容了。
如果各位有不懂的地方,欢迎发消息给小编,小编会进行详细地解答。
最后,请屏幕前的各位吴彦祖和刘亦菲们,动动你们的小手,给小编一个

文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论