leetcode
leetcode 1201 ~ 1250
不浪费原料的汉堡制作方案

不浪费原料的汉堡制作方案

难度:

标签:

题目描述

代码结果

运行时间: 24 ms, 内存: 16.7 MB


/*
 * 题目思路:
 * 1. 通过数学方程推导出巨无霸汉堡和小皇堡的数量。
 * 2. 使用Java Stream API来简化流程控制。
 */

import java.util.*;
import java.util.stream.*;

public class Solution {
    public List<Integer> numOfBurgers(int tomatoSlices, int cheeseSlices) {
        return IntStream.of(tomatoSlices, cheeseSlices)
            .filter(t -> t % 2 == 0 && t >= 2 * cheeseSlices && t <= 4 * cheeseSlices)
            .mapToObj(t -> Arrays.asList((tomatoSlices - 2 * cheeseSlices) / 2, cheeseSlices - (tomatoSlices - 2 * cheeseSlices) / 2))
            .findFirst()
            .orElse(Collections.emptyList());
    }
}

解释

方法:

首先,通过设置两个方程来表示番茄片和奶酪片的使用情况: - 4 * total_jumbo + 2 * total_small = tomatoSlices - total_jumbo + total_small = cheeseSlices 将第二个方程解为 total_jumbo = cheeseSlices - total_small,代入第一个方程,我们可以得到一个只有一个未知数(total_small)的方程。通过解这个方程,我们可以求出 total_small 的值,再代回求 total_jumbo。 为了解这个方程,我们首先将 total_jumbo 用 cheeseSlices 表达,得到: - 4 * (cheeseSlices - total_small) + 2 * total_small = tomatoSlices - 4 * cheeseSlices - 4 * total_small + 2 * total_small = tomatoSlices - 2 * cheeseSlices - 2 * total_small = tomatoSlices 从中解出 total_small,如果得到的解是整数且满足 total_small 和 total_jumbo 都非负,则返回这些值。否则返回空数组表示没有可行解。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
你是怎样确定将原问题转化为两个线性方程来求解的?
原问题给出了制作两种类型汉堡所需的番茄片和奶酪片的数量。通过分析,每个巨无霸汉堡需要4片番茄和1片奶酪,每个小皇堡需要2片番茄和1片奶酪。这种每种资源与汉堡数量的关系形成了线性关系,因此可以通过设立两个方程来表达这种资源消耗关系。第一个方程代表番茄片的总使用量,第二个方程代表奶酪片的总使用量。这样的线性方程组可以通过代数方法来求解,找出符合条件的汉堡数量组合。
🦆
解出的 total_jumbo 和 total_small 都必须是非负整数,但是题解中的验证步骤是否足够确保这一点?
题解中的验证步骤确实足够确保解出的 total_jumbo 和 total_small 都是非负整数。首先,题解中检查了 k % 2,确保从方程中解出的 total_jumbo 是整数(因为如果 k 不是偶数,则 total_jumbo 不会是整数)。其次,通过检查 total_jumbo < 0 或 total_small < 0 来确保所有解都是非负的。如果任何一个条件不满足,则返回空数组表示无解,这样的验证确保了解的有效性和问题的要求符合。
🦆
在方程 `4 * cheeseSlices - 4 * total_small + 2 * total_small = tomatoSlices` 中,如何从中直接推导出 `2 * cheeseSlices - 2 * total_small = tomatoSlices`?
在方程 `4 * cheeseSlices - 4 * total_small + 2 * total_small = tomatoSlices` 中,我们可以通过合并同类项来简化这个方程。具体来说,-4 * total_small 和 +2 * total_small 合并得到 -2 * total_small。因此,方程简化为 `4 * cheeseSlices - 2 * total_small = tomatoSlices`。再将整个方程两边同时除以2,得到 `2 * cheeseSlices - total_small = tomatoSlices / 2`。因此,从原始方程直接推导出简化的方程。
🦆
为什么在解方程时,你选择将 total_jumbo 表达为 `cheeseSlices - total_small` 而不是将 total_small 表达为 `cheeseSlices - total_jumbo`?
选择将 total_jumbo 表达为 `cheeseSlices - total_small` 是因为这样的代换可以直接利用第二个方程 `total_jumbo + total_small = cheeseSlices`。这种代换使得将 total_jumbo 用 cheeseSlices 和 total_small 表示变得直接和简洁,从而可以更容易地将其代入第一个方程进行求解。如果选择将 total_small 表达为 `cheeseSlices - total_jumbo`,虽然同样可行,但在这种情况下,直接用 total_jumbo 代入可以更快地得到 total_small 的表达式和解,这有助于简化计算过程。

相关问题