一、题目描述


二、解题思路
整体思路
可以采用哈希表+模拟来解决这个问题,哈希表用于记录手中5、10面额的钱的数量,模拟这个结账的过程。
具体思路
(1)hash向量用于记录手中5、10面额的钱的数量,用于模拟哈希表,由于只需要记录两种面额钱的出现次数,所以将长度初始化为3,元素为0;
(2)遍历bills数组:
<1>如果当前的客人持有的是5美元,就执行hash[1]++;
<2>如果当前的客人持有的是10美元,如果有手上有5美元,就进行找零,continue。如果手上没有5美元,表示无法找零,返回false;
<3>如果当前的客人持有的是20美元,优先用一张10一张5进行找零,然后是3张5美元找零,如果都不能找零,就返回false;
(3)若可以将循环执行完,表示可以完成找零,返回true;
三、代码实现
cpp
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
//哈希表+模拟
//数组模拟哈希表
vector<int> hash(3,0);
for(auto b:bills){
if(b==5) hash[1]++;
if(b==10){
if(hash[1]==0) return false;
else{
hash[1]--;
hash[2]++;
}
}
if(b==20){
//找零10和5美元
if(hash[2]>=1&&hash[1]>=1){
hash[2]--;
hash[1]--;
continue;
}
//找零3个5美元
if(hash[1]>=3){
hash[1]-=3;
continue;
}
return false;
}
}
return true;
}
};