用JavaScript刷leetcode第860题-柠檬水找零

1,062 阅读1分钟

一、前言

找零一般都是用贪心算法,局部最优是每次找零尽量留5元,局部最优导致结果最优。

二、题目描述

image.png 如果觉得上图模糊,可以看leetcode题目链接

三、分析

  • 只有3种币额:5、10、20
  • 遇到5元,无需找零,收入囊中
  • 遇到10元,兜里有5元,找5元收10元;兜里没5元,对不起,关门咱不卖了
  • 遇到20元,兜里没有5元无论如何也找不开,关门;兜里如果有10元也有5元优先用10元找,找一张10元一张5元;如果兜里只有5元,但是不超过3张,对不起,要关门

四、代码

git代码地址

/**
 * 题号:860
 * leetcode地址:https://leetcode-cn.com/problems/lemonade-change/
 */


/**
 * @param {number[]} bills
 * @return {boolean}
 */
var lemonadeChange = function(bills) {
  // 5元、10元计数
  let count5 = 0
  let count10 = 0

  for(const val of bills) {
    // 遇到5元放进口袋,无需找钱
    if(val === 5) count5++

    // 遇到10元
    if(val === 10) {
      // 兜里有没有5元,找不开就关门,好家伙
      if(count5 < 1) return false
      // 兜里有5元,找给客人5元收下10元
      count5--
      count10++
    }

    // 遇到20元,这里贪心,先找10元再找5元。
    if(val === 20) {
      // 没有5元,无论如何也找不开,那今天就收摊了
      if(count5 < 1) return false

      // 有5元的前提下,看看有没有10元
      if(count10) {
        // 有10元,那就找客人一张5元一张10元
        count5--
        count10--
      } else {
        // 没有10元,兜里的5元也找不开,那就关门
        if(count5 < 3) return false
        // 兜里5元大大的多,那就找客人3张5元
        count5 -= 3
      }

    }
  }

  // 干了一天真好,客人的钱都能找开
  return true
};