题目:
- 在柠檬水摊上,每一杯柠檬水的售价为
5
美元。顾客排队购买你的产品,(按账单bills
支付的顺序)一次购买一杯。 - 每位顾客只买一杯柠檬水,然后向你付
5
美元、10
美元或20
美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付5
美元。 - 注意,一开始你手头没有任何零钱。
- 给你一个整数数组
bills
,其中bills[i]
是第i
位顾客付的账。如果你能给每位顾客正确找零,返回true
,否则返回false
。
示例:
- 输入: b i l l s = [ 5 , 5 , 5 , 10 , 20 ] bills = [5,5,5,10,20] bills=[5,5,5,10,20]
- 输出: t r u e true true
- 解释:
- 前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
- 第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
- 第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
- 由于所有客户都得到了正确的找零,所以我们输出 true。
解题思路:贪心算法
首先定义一个长度为3
的整型数组in
用来分别表示5元
、10元
、20元
的进账数量,然后遍历bills
数组,每遍历一个数,判断其是5、10还是20,然后走相应的判断逻辑,若是5,则直接进账;若是10,则判断是否有5元找;若是20,则有两种情况,首先是用10元和5元找钱,还有一种是三张5元找钱。这里运用贪心策略,优先使用10元找钱,因为5元更万能,若是5元找出去完了,那么后续再来10元则无法找钱。
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int in[3] = {0}; // in[0]是5元进账数量,in[1]是10元进账数量,in[2]是20元进账数量
for(int i = 0; i < bills.size(); i++){
if(bills[i] == 5) in[0]++;
if(bills[i] == 10){
if(in[0] <= 0) return false;
in[0]--;
in[1]++;
}
if(bills[i] == 20){
if(in[0] > 0 && in[1] > 0){
in[0]--;
in[1]--;
} else if (in[0] >= 3){
in[0] -= 3;
} else return false;
}
}
return true;
}
};