题目:
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
注意,一开始你手头没有任何零钱。
给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。
示例:
输入:bills = [5,5,5,10,20]
输出:true
解释:
前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出 true。
输入:bills = [5,5,10,10,20]
输出:false
解释:
前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。
对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。
对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。
由于不是每位顾客都得到了正确的找零,所以答案是 false。
方法一:贪心算法
这个题目呢,我们需要注意一点的就是,我们只能用5,10,20,去找零,并且顾客不能给我们返回差值。什么意思呢?例如:顾客给我们一张20元,我们手中只剩一张20元,我们就无法找零,按理说,我们现在拥有的总金额是大于15的,但是我们仍然无法找零。只能返回False。
那么我们继续分析题目,我们需要找零的钱分别是0元、五元、十五元。其中零元和五元都很好找,但是十五元有两种方案:10+5、5+5+5。那么我们需要记录下我们5元和10元的数量值,而不需要记录20的。并且当遇到找零15元的情况下,我们优先考虑10+5,因为5元是万能的。如果这样的话,这道题就迎刃而解了。其具体代码如下:
# 贪心算法
def fun(bills):
five = 0
ten = 0
for bill in bills:
if bill == 5:
five += 1
elif bill == 10:
if five == 0:
return False
else:
five -= 1
ten += 1
elif bill == 20:
if ten > 0 and five > 0:
five -= 1
ten -= 1
elif five>=3:
five -= 3
else:
return False
return True
网友评论