860.柠檬水找零
文章链接:代码随想录 (programmercarl.com)
思路:
(1)定义一个map,用来存储收入时,5,10,20出现的次数,key为金额,value为对应金额出现的次数
(2)5不用找零,10要找零5,20要找零15(10 + 5)或者(5 + 5 + 5)
(3)然后开始遍历bills数组,出现10就看对应5的频次是否为0,不为0的话5频次就减去1,为0就返回false
(4)遍历bills数组,出现20则看10频次和5频次两者是否都大于0,或者看5的频次是否大于等3
看完文章后的反思:
(1)自己用map想复杂了
(2)只需要维护三种金额的数量,5,10和20。
有如下三种情况:
- 情况一:账单是5,直接收下。
- 情况二:账单是10,消耗一个5,增加一个10
- 情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5
(3)因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!
所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零
Java代码:
class Solution {
public boolean lemonadeChange(int[] bills) {
int num5 = 0;
int num10 = 0;
for(int i = 0; i < bills.length;i++){
//遇到5,不需要找零
if(bills[i] == 5){
num5++;
}
//遇到10,进账