最接近目标价格的甜点成本
难度:
标签:
题目描述
代码结果
运行时间: 64 ms, 内存: 16.5 MB
/*
* 思路:
* 1. 使用递归生成所有可能的配料组合。
* 2. 使用Java Stream找到最接近目标的组合。
*/
import java.util.*;
import java.util.stream.*;
public class DessertCostStream {
public int closestCost(int[] baseCosts, int[] toppingCosts, int target) {
Set<Integer> allCosts = new HashSet<>();
allCosts.add(0);
for (int topping : toppingCosts) {
List<Integer> currentCosts = new ArrayList<>(allCosts);
for (int cost : currentCosts) {
allCosts.add(cost + topping);
allCosts.add(cost + 2 * topping);
}
}
return Arrays.stream(baseCosts)
.flatMap(base -> allCosts.stream().mapToInt(topping -> base + topping))
.boxed()
.min(Comparator.comparingInt(cost -> Math.abs(cost - target)))
.orElse(0);
}
}
解释
方法:
此问题的解决方案使用深度优先搜索(DFS)来生成所有可能的配料组合的成本,并以此来找出最接近目标价的甜点成本。首先,对于配料成本,我们可以考虑每种配料最多两份,因此可以将每份配料复制一份,从而将问题转化为选择或不选择配料的问题。使用DFS遍历所有可能的配料成本组合,并将结果存储在数组中。对于每一种基础成本,我们结合配料成本,使用二分查找(由于数组是有序的)来寻找最接近目标成本的组合。如果找到多个相同距离的成本,则选择成本较低的一个。
时间复杂度:
O(n * 3^m * log(3^m))
空间复杂度:
O(3^m)
代码细节讲解
🦆
在深度优先搜索(DFS)中,每种配料有三种选择(不添加、添加一份、添加两份),为什么这种分类足以涵盖所有情况而不会遗漏任何可能的成本组合?
▷🦆
解题思路中将配料成本的数组`arr`进行排序后使用二分查找,为什么排序是必要的,直接遍历不可以吗?
▷🦆
在进行二分查找时,你选择了`bisect_left`方法,请问这个方法的作用是什么,并说明为何它适用于这个问题?
▷