leetcode
leetcode 1551 ~ 1600
最接近目标价格的甜点成本

最接近目标价格的甜点成本

难度:

标签:

题目描述

代码结果

运行时间: 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)中,每种配料有三种选择(不添加、添加一份、添加两份),为什么这种分类足以涵盖所有情况而不会遗漏任何可能的成本组合?
在提供的问题中,每种配料可以选择不添加、添加一份或添加两份。这种方法确保了所有可能的成本组合都被考虑到,因为对于每种配料,我们都探索了其所有可能的贡献(即0份、1份或2份)。通过递归地应用这一逻辑,深度优先搜索(DFS)能够遍历生成所有从不添加任何配料到添加每种配料两份的所有可能的成本组合。因此,这种分类方法确保了在配料的选择上没有遗漏任何潜在的成本计算,从而可以精确地计算出接近目标价格的甜点成本。
🦆
解题思路中将配料成本的数组`arr`进行排序后使用二分查找,为什么排序是必要的,直接遍历不可以吗?
将配料成本的数组`arr`进行排序后使用二分查找是为了提高查找效率。如果直接遍历数组来找到最接近目标的成本组合,时间复杂度为O(n),其中n是数组`arr`的长度。但通过首先排序数组,然后使用二分查找,我们可以将查找最接近值的时间复杂度降低到O(log n)。这样做特别在数组长度较大时更有效率。排序确保了数组是有序的,这是二分查找算法的前提条件,因为二分查找通过比较中间元素与目标值来决定搜索的方向,这一过程依赖于数组的有序性。
🦆
在进行二分查找时,你选择了`bisect_left`方法,请问这个方法的作用是什么,并说明为何它适用于这个问题?
`bisect_left`方法是一个在有序列表中进行二分查找的函数,它返回插入点以维持列表的排序顺序,即它找到第一个不小于目标值的元素的位置。在本问题中,这意味着`bisect_left`可以帮助我们快速找到不小于目标成本(调整后的目标值减去基础成本和当前配料成本的差值)的第一个成本值,在这个基准上我们可以比较最近的两个成本(当前位置和前一个位置),以确定哪个更接近目标成本。使用`bisect_left`能够有效地缩小搜索范围并快速定位,从而提高整体的查找效率。

相关问题