题目
在柠檬水摊上,每一杯柠檬水的售价为 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。
方法
顾客付款共存在三种情况:五美元,十美元,二十美元
- 若顾客支付五美元,则不需要进行找零,五美元所拥有的数量加一
- 若顾客支付十美元,则需要进行找零,返还给顾客五美元
- 若顾客支付二十美元,则需要进行找零,返还给顾客十美元和五美元的组合,或三张五美元。因为十美元只能用于二十美元的找零,而五美元可以用于十美元和二十美元的找零,那么在收到二十美元时,应先返还十美元
class Solution(object):
def lemonadeChange(self, bills):
num = [0] * 3
for i in range(len(bills)):
if bills[i] == 5:
num[0] += 1
elif bills[i] == 10:
num[1] += 1
if num[0] > 0:
num[0] -= 1
else:
return False
else:
num[2] += 1
if num[1] > 0 and num[0] > 0:
num[1] -= 1
num[0] -= 1
elif num[0] > 2:
num[0] -= 3
else:
return False
return True
优化:因二十美元不能用来找零,那么该纸币的数量可以不用进行记录
网友评论