返回

在 LeetCode 上用 JavaScript 解决柠檬水找零难题:一步一步来!

前端

在 LeetCode 的题海中遨游,我们遇到了一个颇具挑战性的第 860 题——柠檬水找零。在这道题中,我们扮演了一个卖柠檬水的老板,面对络绎不绝的顾客,我们需要正确地找零。

乍看之下,这似乎是一项简单的任务,但隐藏在看似平凡的找零背后,是一个贪心算法的巧妙应用。为了深入理解这一算法,让我们踏上一个循序渐进的 JavaScript 解决之旅。

贪心算法:一步一步找最优

贪心算法的精髓在于局部最优导致全局最优。在这个找零问题中,我们的目标是找到一种找零方式,使得我们手头的硬币数量最少。

根据贪心思想,我们在找零时总是优先使用 5 元硬币。这是因为使用 5 元硬币找零,会比使用 1 元和 10 元硬币找零留下更少的硬币。

具体来说,我们的找零策略如下:

  1. 如果顾客给了 10 元,我们找 5 元。
  2. 如果顾客给了 5 元,我们不用找零。
  3. 如果顾客给了 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 代码主要使用两个变量 fivestens 来记录手头 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 优化