一、前言
找零一般都是用贪心算法,局部最优是每次找零尽量留5元,局部最优导致结果最优。
二、题目描述
如果觉得上图模糊,可以看leetcode题目链接
三、分析
- 只有3种币额:5、10、20
- 遇到5元,无需找零,收入囊中
- 遇到10元,兜里有5元,找5元收10元;兜里没5元,对不起,关门咱不卖了
- 遇到20元,兜里没有5元无论如何也找不开,关门;兜里如果有10元也有5元优先用10元找,找一张10元一张5元;如果兜里只有5元,但是不超过3张,对不起,要关门
四、代码
/**
* 题号: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
};