目录
题目:
示例:
分析:
代码+运行结果:
题目:
示例:
分析:
这是一道模拟题,我们贩卖五美元(忒贵了)一杯的柠檬水,然后只收取5,10,20面值的钞票,问我们能不能在一开始没有任何零钱的情况下,完成每一笔交易(正确找零)。
这题只需要正常模拟就可以,不过有个小细节,就是如果顾客付了20美元,那么我们需要找15元回去,而这个15元可以由10元和5元组成,也可以是三张5元组成,我们应该怎么选择呢?
首先我们分析一下,如果顾客付的是5元,那么我们不用找零,直接收下。
如果顾客付的是10元,那么我们需要找零5元,也只能找零一张5元,这是没得选的。
而如果顾客付的是20元,那么我们找零15元,可以是10+5,也可以是5+5+5,这是有的选的,操作空间也就在这里了。
我们可以发现,5元是比较“万能”的,它可以找零10元和20元,而10元只能找零20元,所以我们用一点贪心思想,如果顾客付的20元,那么我们优先找零10元,这样可以节省下“万能”的5元用于其他面额的找零。
总结一下就是,如果顾客付5元,我们收下,并记录。如果顾客付10元,我们收下,记录,并将库存的5元数量减一。如果顾客付20元,我们优先找零10元+5元,没有10元的情况下找零三张5元。
代码+运行结果:
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
//moneys[0]表示五元数,moneys[1]表示十元数,因为无法使用二十元找零,因此不用记录二十元数
vector<int> moneys(2,0);
for(const int &b:bills){
if(b==5){
//收取五元,无需找零
moneys[0]++;
}else if(b==10){
//收取十元,只能用五元找零,没有五元则返回false
if(moneys[0]==0) return false;
moneys[0]--;
moneys[1]++;
}else{
//收取20元,如果有十元则优先使用十元找零.
if(moneys[1]>=1){
//使用十元找零还需要一个五元
if(moneys[0]>=1){
moneys[1]--;
moneys[0]--;
}else return false;
}else{
//没有十元则需要3张五元
if(moneys[0]>=3) moneys[0]-=3;
else return false;
}
}
}
return true;
}
};