题目
思路
贪心策略是:把数组变成小根堆,每次都取堆中最小的,把这两个数的和再加到堆里。重复这样处理的过程,直到最后堆中只剩下1个数为止。
举个例子,1、2、6、4、3、7、1、8要组成小根堆:
1)拿出2个1,将2个1结合,产生2,把2放回小根堆。此时小根堆含有2、6、4、3、7、8、2
2)拿出2个2,将2个2结合,产生4,把4放回小根堆。此时小根堆含有4、6、4、3、7、8
3)拿出3和4,将3和4结合,产生7,把7放回小根堆。此时小根堆含有4、6、7、7、8
4)拿出4和6,将4和6结合,产生10,把10放回小根堆。此时小根堆含有10、7、7、8
5)拿出7和7,将7和7结合,产生14,把14放回小根堆。此时小根堆含有10、14、8
6)拿出10和8,将10和8结合,产生18,把18放回小根堆。此时小根堆含有18、14
7)拿出14和18,结合14和18,产生32,把32放回小根堆。此时小根堆含有32
总代价为,2+4+7+10+14+18。
package bublleSort;
import java.util.PriorityQueue;
public class Less_Money {
public static int lessMoney(int[] arr) {
PriorityQueue<Integer> queue = new PriorityQueue();
int sum = 0;
int cur = 0;
for(int i = 0; i < arr.length; i++) {
queue.add(arr[i]);
}
while(queue.size() > 1) {
cur = queue.poll() + queue.poll();
sum += cur;
queue.add(cur);
}
return sum;
}
public static void main(String[] args) {
int[] arr = {1,2,6,4,3,7,1,8};
System.out.println(lessMoney(arr));
}
}