LeetCode题解:860. 柠檬水找零,模拟情境,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/lemonade-change/

解题思路:

  1. 首先梳理一下题意:
    • 零钱只有5元和10元两种。
    • 该题只关心是否足够找零,因此收入时只需要考虑收入的零钱数量即可,至于赚了多少钱无需考虑。
  2. 每次收入都对应3种可能情况,以此模拟找零过程:
    • 收入5元,此时5元零钱数量加1。
    • 收入10元,此时10元零钱数量加1,5元零钱数量减1。
    • 收入20元,由于5元零钱更加通用,因此若有10元零钱,则找零10元和5元。若没有10元零钱,则找零3张5元。
  3. 每次完成找零后,查看零钱数量是否为负,若是则表示零钱不够找零,返回false。
  4. 如果能正常退出循环,表示零钱数量都>=0,则返回true。
/**
 * @param {number[]} bills
 * @return {boolean}
 */
var lemonadeChange = function (bills) {
  let five = 0; // 统计5元零钱数量
  let ten = 0; // 统计10元零钱数量

  // 遍历bills,模拟收钱过程
  for (const bill of bills) {
    if (bill === 5) {
      // 如果收到5元钱,只需要收钱,无需找零,5元钱的数量加1
      five++;
    } else if (bill === 10) {
      // 如果收到10元,10元钱数量加1
      // 同时需要找零5元,5元钱数量减1
      ten++;
      five--;
    } else if (bill === 20) {
      // 如果收到20元,则需要找零15元,分为两种情况处理
      if (ten) {
        // 如果有10元零钱,则优先使用10元钱,10元钱数量减1
        ten--;
        // 找零10元后,还需要找零5元,5元钱数量减1
        five--;
      } else {
        // 如果没有10元零钱,则都使用5元找零,5元零钱减3
        five -= 3;
      }
    }

    // 如果经过找零后,零钱数量为负,表示零钱不足,无法找零
    if (five < 0 || ten < 0) {
      return false;
    }
  }

  // 如果能正常退出循环,表示零钱没有为负,零钱足够找零
  return true;
};
上一篇:小技巧——二进制转换


下一篇:读《Graph Matching and Learning in Pattern Recognition in the last ten years》