https://leetcode.cn/problems/lemonade-change/
class Solution {
public boolean lemonadeChange(int[] bills) {
int count5=0;
int count10=0;
for(int bill:bills){
if(bill==10){
if(count5==0){
return false;//没有5找钱
}
else{
count5--;
count10++;
}
}
else if(bill==20){
//(count5==0)||(count5==1&&count10==0)||(count10==0&&count5<3)
if(count10==0){//没有10
if(count5<3){
return false;
}
else{
count5=count5-3;
}
}
else{//count10!=0
if(count5==0){
return false;
}
else{
count10--;
count5--;
}
}
}
else{
count5++;
}
}
return true;
}
}
/**
10:找一张5
20:找一张10一张5;找3张5
*/
情况一:账单是5,直接收下。
情况二:账单是10,消耗一个5,增加一个10
情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5
此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。
而情况三逻辑也不复杂甚至感觉纯模拟就可以了,其实情况三这里是有贪心的。
账单是20的情况,为什么要优先消耗一个10和一个5呢?
因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!