思路:
-
- 遍历
bills数组,判断当前支付费用是否能找零,同时也需要记录当前所拥有零钱数量。
- 遍历
-
- 判断条件:
5元: 给5元的数量加110元: 当前5元数量是否不为0- 为
0则不能顺利找零,返回false - 顺利找零: 给
10元数量加1,5元数量减1
- 为
20元:20有两种找零方式: 1.10 + 52.5 + 5 + 5。这里得优先使用第一种找零方式,因为这样竟可能多的保留了5的数量,会让后面的10可以找零。- 以
10 + 5找零- 是否有1枚以上
10和5元: 是的话,分别减少1枚10元和5元的数量增加1枚20元 - 是否有3枚以上
5元数量: 是的话,减少3枚5元的数量,增加1枚20元 - 否则: 返回false
- 是否有1枚以上
- 以
-
- 如果
bills遍历结束也每天退出循环,直接返回true,表明当前所有账单已顺利找零
- 如果
// 贪心算法
function lemonadeChange(bills: number[]): boolean {
// 因为 20 无法作为零钱找出去,这里不需要申明其对应数量的变量
let five = 0, ten = 0
for(let i = 0; i < bills.length; i++) {
let cur = bills[i]
if (cur === 5) {
five++
} else if (cur === 10) {
if (five > 0) {
five--
ten++
} else {
return false
}
} else {
if (five >= 1 && ten >= 1) {
five--
ten--
} else if (five >= 3) {
five -= 3
} else {
return false
}
}
}
return true
};
// 时间复杂度 O(n); 空间复杂度O(1)