不浪费原料的汉堡制作方案
难度:
标签:
题目描述
代码结果
运行时间: 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)
代码细节讲解
🦆
你是怎样确定将原问题转化为两个线性方程来求解的?
▷🦆
解出的 total_jumbo 和 total_small 都必须是非负整数,但是题解中的验证步骤是否足够确保这一点?
▷🦆
在方程 `4 * cheeseSlices - 4 * total_small + 2 * total_small = tomatoSlices` 中,如何从中直接推导出 `2 * cheeseSlices - 2 * total_small = tomatoSlices`?
▷🦆
为什么在解方程时,你选择将 total_jumbo 表达为 `cheeseSlices - total_small` 而不是将 total_small 表达为 `cheeseSlices - total_jumbo`?
▷