题目:
思考:
1.先用大顶堆存放所有可以发放的优惠券;
2.为了保证期望发放的优惠券张数最少,需要从大到小遍历,所以使用大顶堆一次弹出券的面额。
3.每次遇到可以发放的券,则存到小顶端中,便于后续结果按照从小到大的顺序返回,且N减去所选券的面额。
代码实现:
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
public class salesNums {
public static void main(String[] args) {
int[] arr= {1,2,5,10,20,50};
List<Integer> salesNum = getSalesNum(arr, 75);
System.out.println(salesNum);
}
public static List<Integer> getSalesNum (int[] arr, int sum) {
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>((o1, o2) -> o2 - o1);
for (int num : arr) {
maxHeap.add(num);
}
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
while (sum > 0) {
int tmp = maxHeap.poll();
if (tmp <= sum) {
sum -= tmp;
minHeap.add(tmp);
}
}
List<Integer> ans = new ArrayList<>();
while (!minHeap.isEmpty()) {
ans.add(minHeap.poll());
}
return ans;
}
}