打折购买糖果的最小开销
难度:
标签:
题目描述
代码结果
运行时间: 23 ms, 内存: 16.1 MB
/*
* 思路:
* 使用Java Stream对数组进行降序排序,然后以三个一组进行处理。
* 每组中,前两个糖果的价格累加到总开销中,第三个糖果作为免费糖果。
*/
import java.util.Arrays;
import java.util.stream.IntStream;
public class CandyStoreStream {
public int minCost(int[] cost) {
return IntStream.of(cost)
.boxed()
.sorted((a, b) -> b - a) // 按降序排序
.collect(Collectors.toList())
.stream()
.collect(Collectors.chunking(3)) // 每3个为一组
.mapToInt(chunk -> chunk.stream().limit(2).mapToInt(Integer::intValue).sum()) // 前两个累加
.sum(); // 求和
}
public static void main(String[] args) {
CandyStoreStream css = new CandyStoreStream();
int[] cost = {6, 5, 7, 9, 2, 2};
System.out.println(css.minCost(cost)); // 输出 23
}
}
解释
方法:
该题解的策略是首先将糖果按价格从高到低排序,以保证在购买时能够优先获取价格较高的糖果,从而使得在每次购买两个糖果时,能够免费获得价格相对较低的糖果。具体实施中,每次循环选取三个糖果(如果存在),购买最贵的两个,并免费获得第三个。如果剩下的糖果不足三个,直接购买剩余的糖果。这样做的目的是最大化每次免费获得糖果的价值。
时间复杂度:
O(n log n)
空间复杂度:
O(1)
代码细节讲解
🦆
在解决问题的过程中,为什么选择从最高到最低的顺序对糖果进行排序,而不是从最低到最高或其他顺序?
▷🦆
该算法在处理剩下两个糖果时是否考虑了选择哪两个糖果购买以最大化免费获得的糖果价值?
▷🦆
在每次循环中跳过第三个糖果作为免费糖果的决策是否总是最优,存在没有更好的选择吗?
▷🦆
如果数组长度不是3的倍数,剩下的一到两个糖果的处理逻辑是否足够高效?
▷