题目介绍
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
注意,一开始你手头没有任何零钱。
给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。
示例1
输入:bills = [5,5,5,10,20]
输出:true
解释:
前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出 true。
示例2
输入:bills = [5,5,10,10,20]
输出:false
解释:
前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。
对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。
对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。
由于不是每位顾客都得到了正确的找零,所以答案是 false。
示例3
输入: bills = [5,5,10]
输出: true
示例4
输入: bills = [10,10]
输出: false
提示:
1 <= bills.length <= 10^5bills[i]不是5就是10或是20leetcode-860 柠檬水找零 b站视频
解题思路
1.创建两个变量 five 和 ten,记录我们手上 5 美元和 10 美元的数量
2.遍历 bills 数组
- 当值为 5 时,不需要找零,five 数量加 1
- 当值为 10 时,需要找零 5,此时 ten 的数量加 1,five 的数量减 1
- 当值为 20 时,需要找零 15,此时我们可以找零 10 + 5,或者 5 + 5 + 5,分别对应 ten 减 1、five 减 1 或者 five - 3,由于 5 既可以给 10 找零,也可以给 20 找零,所以有 10 的时候应该优先使用 10 + 5
3.当我们遍历到某个账单无法找零时,返回 false,游戏结束
4.当我们可以成功为所有的账单找零时,返回 true
解题代码
var lemonadeChange = function(bills) {
let five = ten = 0
for (let i = 0; i < bills.length; i++) {
switch(bills[i]) {
case 5:
five++
break;
case 10:
if (!five) return false
ten++
five--
break
case 20:
if (!five || (five < 3 && !ten)) return false
if (ten) {
ten--
five--
} else {
five -= 3
}
break
}
}
return true
};
以上就是本题的解题思路,欢迎查看我的其他文章
[路飞]_环形链表
[路飞]_环形链表II
[路飞]_快乐数
[路飞]_反转链表
[路飞]_反转链表II
[路飞]_K 个一组翻转链表
[路飞]_旋转链表
[路飞]_两两交换链表中的节点
[路飞]_最近的请求次数
[路飞]_第 k 个数
[路飞]_亲密字符串