leetcode860.柠檬水找零

题目链接

题目描述:

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。
顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
注意,一开始你手头没有任何零钱。
如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

题解:贪心策略

因为每位顾客只会向你支付5美元,10美元以及20美元面值的钱,我们思考下收到这些钞票的找钱策略:

  1. 当顾客支付了5美元的钞票时,那么我们不需要找零,得到了5美元
  2. 当顾客支付了10美元的钞票时,我们需要给顾客找回一张5美元的钞票,如果此时没有五美元,那么就返回false
  3. 当顾客支付了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)

执行结果:


你可能感兴趣的:(leetcode860.柠檬水找零)