860, 柠檬水找零
大约 2 分钟
一、题目描述
在柠檬水摊上,每一杯柠檬水的售价为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
。
提示
1 <= bills.length <= 10⁵
bills[i]
不是5
就是10
或是20
相关主题
- 贪心
- 数组
二、题解
方法 1: 贪心
pub fn lemonade_change(bills: Vec<i32>) -> bool {
let mut counter = [0; 3];
for bill in bills {
match bill {
20 => { // 共找零15元
if counter[1] == 0 {
// 没有10元,15 = 3 * 5
if counter[0] < 3 {
return false;
}
counter[0] -= 3;
} else {
// 有10元,15 = 10 + 5
if counter[0] == 0 {
return false;
}
counter[0] -= 1;
counter[1] -= 1;
}
counter[2] += 1;
}
10 => { // 共找零5元
if counter[0] == 0 {
return false;
}
counter[0] -= 1;
counter[1] += 1;
}
_ => counter[0] += 1,
}
}
true
}
public boolean lemonadeChange(int[] bills) {
int[] counter = {0, 0, 0}; // 5, 10, 20
for (int bill : bills) {
switch (bill) {
case 20: { // 共找零15元
if (counter[1] == 0) { // 没有10元,15 = 3 * 5
if (counter[0] < 3) {
return false;
}
counter[0] -= 3;
} else { // 有10元,15 = 10 + 5
if (counter[0] == 0) {
return false;
}
counter[0]--;
counter[1]--;
}
counter[2]++;
break;
}
case 10: { // 共找零5元
if (counter[0] == 0) {
return false;
}
counter[0]--;
counter[1]++;
break;
}
default: counter[0]++;
}
}
return true;
}