一. 题目描述
在柠檬水摊上,每一杯柠檬水的售价为 5
美元。
顾客排队购买你的产品,(按账单 bills
支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5
美元、10
美元或 20
美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5
美元。
注意,一开始你手头没有任何零钱。
如果你能给每位顾客正确找零,返回 true
,否则返回 false
。
示例 1:
输入:[5,5,5,10,20] 输出:true 解释: 前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。 第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。 第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。 由于所有客户都得到了正确的找零,所以我们输出 true。
二. 思路
最近,决定按照模块的方式来刷leetcode的题,所以准备先把leetcode关于贪心算法的简单题都先做完,所以,接下来的几篇博客都会与贪心算法相关。
这道题的思路还是非常明显的,经典的找零题目,不过其中假如了一个限制条件,那就是是否能够成功找零,那么这里就要比原先那种找零的题目多出一个判断是否能够成功找零。
那么如果能够成功找零,就到了使用贪心算法的时候了,假如客户给的是5元,那么直接完成交易,客户给的是10元,则给客户5元的零钱,假如用户给的是20元,那么先检查是否有10元,如果有,则选择10元+5元的方案,如果没有10元,则给客户3*5元。
其实只有客户给的是10元的时候才会使用贪心算法。
三. 代码
class Solution {
public boolean lemonadeChange(int[] bills) {
int count_money[] = {0, 0, 0}; //其中,从前往后分别表示5,10,20的数量。
for(int bill : bills)
{
if(bill == 5)
count_money[0] += 1;
else if(bill == 10 && count_money[0] != 0)
{
count_money[0] -= 1;
count_money[1] += 1;
}
else if(bill == 10 && count_money[0] == 0)
{
return false;
}
else if(bill == 20 && count_money[1] != 0 && count_money[0] != 0)
{
count_money[0] -= 1;
count_money[1] -= 1;
count_money[2] += 1;
}
else if(bill == 20 && count_money[0] >= 3)
{
count_money[0] -= 3;
count_money[2] += 1;
}
else
{
return false;
}
}
return true;
}
}