题目描述:
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。
顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
注意,一开始你手头没有任何零钱。
如果你能给每位顾客正确找零,返回 true ,否则返回 false 。
题解:贪心策略
因为每位顾客只会向你支付5美元,10美元以及20美元面值的钱,我们思考下收到这些钞票的找钱策略:
- 当顾客支付了5美元的钞票时,那么我们不需要找零,得到了5美元
- 当顾客支付了10美元的钞票时,我们需要给顾客找回一张5美元的钞票,如果此时没有五美元,那么就返回false
- 当顾客支付了20美元的钞票时,我们需要给顾客找回15美元的钞票,这时则分为两种情况:第一种为找回一张10美元+一张5美元;第二种为找回三张五美元的钞票,如果无法找回,则返回false
代码如下:
class Solution {
public boolean lemonadeChange(int[] bills) {
int five = 0;
int ten = 0;
for( int i = 0 ; i < bills.length ; ++i){
if (bills[i] == 5){
five++;
} else if (bills[i] == 10){
if (five < 1){
return false;
}
five--;
ten++;
} else {
if (ten > 0){
if (five < 1){
return false;
}
ten--;
five--;
} else {
if (five < 3){
return false;
}
five -= 3;
}
}
}
return true;
}
}
时间复杂度:O(N)
额外空间复杂度:O(1)
执行结果: