解题思路:
程序逻辑:遍历bills容器(数组),使用unordered_map记录手中的5美元和10美元的数量(无需记录20美元,因为不可能将20美元找零出去)。
循环体内程序:
每当遇到一个5美元,则相应数量加1;
当遇到一个10美元时,判断手中是否有5美元,没有的话就return false,有的话就将5美元数量减1,10美元数量加1;
当遇到20美元时,有两种找零情况:找一张10美元和一张5美元,或者找零三张5美元。
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
//只需要在unordered_map中记录5和10美元的数量
unordered_map<int, int> mp;
for(auto b: bills){
if(b == 5) mp[b]++;
else if(b == 10){
if(mp[5] == 0) return false;
else{ //找零一张5美元,收入一张10美元
mp[5]--;
mp[10]++;
}
}
else{ //必须找零一张10美元和一张5美元,或者找零3张5美元
if(mp[10] > 0){ //有10美元,就找零给顾客
if(mp[5] == 0) return false;
else{
mp[10]--;
mp[5]--;
}
}
else{ //没有10美元,看看有没有三张5美元
if(mp[5] < 3) return false;
else mp[5] = mp[5] - 3;
}
}
}
return true;
}
};