[亚麻社招OA]Merge Files by Pairs(背景:合并音乐文件/组装零件)

题意:

给定n个文件, 和一个list of file size, 求minimum time to merge file

 

Example1:

Input: 

files =  {8, 4, 6, 12}

numOfSubFiles = 4 

Output: 

58 

Explaination:

先将 4 和 6 merge为 size 是 10 的新file。目前为止耗时为10。 files 变为 {8, 10, 12}

再将 8 和 10 merge为 size 是 18 的新file。目前为止耗时为 10 + 18 = 28。files 变为 {12, 18}

最后将 12 和 18 merge为 size 是 30 的新file。目前为止耗时为 10 + 18 + 30 = 58。 files 变为 {30}

 

Example2:

Input:

files =  {3, 1, 2}

numOfSubFiles = 3 

Output: 

9

Explaination:

1 + 2 = 3;

3 + 3 = 6;

3 + 6 = 9

 

Example3:

Input:

files =  {8, 3, 5, 2, 15}

numOfSubFiles = 5 

Output: 

66

Explaination:

2 + 3 = 5;

5+5 = 10;

10 + 8 = 18;

18 + 15 = 33;

5 + 10 + 18 + 33 = 66



思路: PriorityQueue

将files中所有元素放入minHeap,每次poll两个最小的,merge之后放回minHeap。直至minHeap中只剩一个元素。输出循环中的累计时间。

 

复杂度:

时间: O(nlogn)

空间: O(n)

 

代码

 1 public class MergeFilesByPairs {
 2     public int mergeFiles(int numOfSubFiles, List<Integer> files) {
 3         int resSum = 0;
 4         PriorityQueue<Integer> minHeap = new PriorityQueue<>((o1, o2) -> o1 - o2);
 5         for (int i = 0; i < files.size(); i++) {
 6             minHeap.add(files.get(i));
 7         }
 8         while (minHeap.size() != 1) {
 9             int a = minHeap.poll();
10             int b = minHeap.poll();
11             int temSum = a + b;
12             resSum += temSum;
13             minHeap.add(temSum);
14         }
15         return resSum;
16     }
17 
18     public static void main(String[] args) {
19         MergeFilesByPairs test = new MergeFilesByPairs();
20         // TEST CASE1: files =  {8, 4, 6, 12}
21         int numOfSubFiles = 4;
22         List<Integer> list = new ArrayList<>();
23         list.add(8);
24         list.add(4);
25         list.add(6);
26         list.add(12);
27         System.out.println("TEST CASE1:");
28         System.out.println(test.mergeFiles(numOfSubFiles, list));
29 
30         // TEST CASE2: files =  {3, 1, 2}
31         int n2 = 3;
32         List<Integer> l2 = new ArrayList<>();
33         l2.add(3);
34         l2.add(1);
35         l2.add(2);
36         System.out.println("TEST CASE2:");
37         System.out.println(test.mergeFiles(n2, l2));
38 
39         // TEST CASE3: files =  {8, 3, 5, 2, 15}
40         int n3 = 5;
41         List<Integer> l3 = new ArrayList<>();
42         l3.add(8);
43         l3.add(3);
44         l3.add(5);
45         l3.add(2);
46         l3.add(15);
47         System.out.println("TEST CASE3:");
48         System.out.println(test.mergeFiles(n3, l3));
49     }
50 }

 

参考:

https://www.geeksforgeeks.org/optimal-file-merge-patterns/

https://leetcode.com/problems/minimum-cost-to-merge-stones/description/

https://www.geeksforgeeks.org/connect-n-ropes-minimum-cost/

 

转载于:https://www.cnblogs.com/liuliu5151/p/11026117.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值