860. 柠檬水找零
✅做题思路or感想
这一题经典贪心
难点有二
- 如何模拟钱币交换的过程
- 贪心的策略
如何模拟钱币交换的过程
这里其实用三个数组分别来记录三种纸币的数量就可以了(是不是很简单)
贪心的策略
这里先分情况
- 客人付了5块钱。这个时候不需要找零
- 客人付了10块钱,需要找5块钱回去
- 客人付了20块钱,可以付3张5块钱回去,也可以付1张10块钱和1张五块钱
这里贪心的策略主要针对第三种情况。由上面分情况可知道5块钱的纸币是灵活性最高的,所以应该优先保留。所以在客人付20块钱时,先考虑给他1张10和1张5,如果不行,再考虑给他3张5块的,这就是贪心策略
代码如下
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
//准备三个数组来记录三种纸币数量
int money5 = 0, money10 = 0, money20 = 0;
for (int i = 0; i < bills.size(); i++) {
//情况1
if (bills[i] == 5) {
money5++;
}
//情况2
if (bills[i] == 10) {
money10++;
money5--;
if (money5 < 0)return false;
}
//情况3
if (bills[i] == 20) {
money20++;
//贪心
if (money10 > 0 && money5 > 0) {
money5--;
money10--;
} else if (money5 > 2) {
money5 -= 3;
} else return false;
}
}
//如果过程完整走完而不出错,则所有客户都可以得到正确的找零
return true;
}
};