原题链接:https://leetcode-cn.com/problems/lemonade-change/
解题思路:
- 首先梳理一下题意:
- 零钱只有5元和10元两种。
- 该题只关心是否足够找零,因此收入时只需要考虑收入的零钱数量即可,至于赚了多少钱无需考虑。
- 每次收入都对应3种可能情况,以此模拟找零过程:
- 收入5元,此时5元零钱数量加1。
- 收入10元,此时10元零钱数量加1,5元零钱数量减1。
- 收入20元,由于5元零钱更加通用,因此若有10元零钱,则找零10元和5元。若没有10元零钱,则找零3张5元。
- 每次完成找零后,查看零钱数量是否为负,若是则表示零钱不够找零,返回false。
- 如果能正常退出循环,表示零钱数量都>=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;
};