返回
在 LeetCode 上用 JavaScript 解决柠檬水找零难题:一步一步来!
前端
2023-11-30 12:59:33
在 LeetCode 的题海中遨游,我们遇到了一个颇具挑战性的第 860 题——柠檬水找零。在这道题中,我们扮演了一个卖柠檬水的老板,面对络绎不绝的顾客,我们需要正确地找零。
乍看之下,这似乎是一项简单的任务,但隐藏在看似平凡的找零背后,是一个贪心算法的巧妙应用。为了深入理解这一算法,让我们踏上一个循序渐进的 JavaScript 解决之旅。
贪心算法:一步一步找最优
贪心算法的精髓在于局部最优导致全局最优。在这个找零问题中,我们的目标是找到一种找零方式,使得我们手头的硬币数量最少。
根据贪心思想,我们在找零时总是优先使用 5 元硬币。这是因为使用 5 元硬币找零,会比使用 1 元和 10 元硬币找零留下更少的硬币。
具体来说,我们的找零策略如下:
- 如果顾客给了 10 元,我们找 5 元。
- 如果顾客给了 5 元,我们不用找零。
- 如果顾客给了 1 元,我们先检查是否有 5 元硬币,如果有,我们就找 4 元(5-1);如果没有,我们就找 9 元(10-1)。
JavaScript 代码实现
/**
* @param {number[]} bills
* @return {boolean}
*/
const lemonadeChange = function (bills) {
let fives = 0;
let tens = 0;
for (const bill of bills) {
if (bill === 5) {
fives++;
} else if (bill === 10) {
if (fives > 0) {
fives--;
tens++;
} else {
return false;
}
} else if (bill === 20) {
if (fives > 0 && tens > 0) {
fives--;
tens--;
} else if (fives >= 3) {
fives -= 3;
} else {
return false;
}
}
}
return true;
};
代码详解
我们的 JavaScript 代码主要使用两个变量 fives
和 tens
来记录手头 5 元和 10 元硬币的数量。
遍历每个顾客给出的纸币时,我们根据找零策略进行判断:
- 如果顾客给了 5 元,我们就直接增加
fives
。 - 如果顾客给了 10 元,我们先检查是否有 5 元硬币,如果有,我们就减少 1 个 5 元硬币并增加 1 个 10 元硬币;如果没有,我们直接返回
false
,表示无法找零。 - 如果顾客给了 20 元,我们首先检查是否有 5 元和 10 元硬币,如果有,我们就减少 1 个 5 元和 1 个 10 元硬币;如果没有,我们检查是否有至少 3 个 5 元硬币,如果有,我们就减少 3 个 5 元硬币;否则,我们返回
false
,表示无法找零。
遍历完所有顾客给出的纸币后,如果我们手头上没有剩余的硬币,就说明我们成功找零,返回 true
;否则,返回 false
。
SEO 优化