At a lemonade stand, each lemonade costs $5.
Customers are standing in a queue to buy from you, and order one at a time (in the order specified by bills).
Each customer will only buy one lemonade and pay with either a $5, $10, or $20 bill. You must provide the correct change to each customer, so that the net transaction is that the customer pays $5.
Note that you don’t have any change in hand at first.
Return true if and only if you can provide every customer with correct change.
Example 1:
Input: [5,5,5,10,20]
Output: true
Explanation:
From the first 3 customers, we collect three $5 bills in order.
From the fourth customer, we collect a $10 bill and give back a $5.
From the fifth customer, we give a $10 bill and a $5 bill.
Since all customers got correct change, we output true.
找零钱的问题,柠檬水一杯5块,刚开始手上没有钱,按顺序从数组得到零钱,问是否能给数组中每个数找零
思路:
比较简单的是只有3中面值的货币,5,10和20,显然5是不用找零的,10的话只需要找5,20的话要么找一张10一张5,要么3张5
找零方法是固定的,所以只需要保存3中面值货币的数量,一旦需要的时候数量<=0, 直接返回false
//2ms
public boolean lemonadeChange(int[] bills) {
if (bills == null || bills.length == 0) {
return true;
}
int[] billCounts = new int[3]; //5, 10, 20
for (int i = 0; i < bills.length; i++) {
switch (bills[i]) {
case 5:
billCounts[0] ++;
break;
case 10:
if (billCounts[0] <= 0) {
return false;
}
billCounts[0] --;
billCounts[1] ++;
break;
case 20:
if ((billCounts[1] <= 0 && billCounts[0] < 3) ||
(billCounts[0] <= 0)){
return false;
}
if (billCounts[1] <= 0) {
billCounts[0] -= 3;
} else {
billCounts[1] --;
billCounts[0] --;
}
billCounts[2] ++;
break;
}
}
return true;
}