实现思路
正常从前往后遍历bills数组,另开辟一个数组存储现在拥有的零钱,10元正常找零5即可,20元找零使用贪心的策略,先找10元、5元组合,没有这样的组合再尝试找3张5元的零钱
实现代码
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
vector<int> cur(21,0);
for(int i=0;i<bills.size();i++){
cur[bills[i]]++;
if(bills[i]>5){
int flag=0;
if(bills[i]==10)
{
if(cur[5]){
cur[5]--;
}
else return false;
}
else{
if(cur[5]&&cur[10]){
cur[5]--;
cur[10]--;
}
else if(cur[5]>=3){
cur[5]-=3;
}
else return false;
}
}
}
return true;
}
};
两个代码的对比
我的第一个代码使用数组来进行标识,好处是可以直接利用面值来进行取值,坏处开辟了不必要的空间,可以直接像第二种代码那样用两个int类型的变量取值即可
第二个代码在处理20的地方方式更好,如果存在10元直接先找10元,剩下的可以统一用while循环来解决找5元零钱的问题
提交结果及分析
时间复杂度O(n)