柠檬水找零问题

 

分享简单算法:柠檬水找零

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。

顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

注意,一开始你手头没有任何零钱。

如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

示例 1:

语言:java

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0, ten = 0;
        for (int bill: bills) {
            if (bill == 5)
                five++;
            else if (bill == 10) {
                if (five == 0) return false;
                five--;
                ten++;
            } else {
                if (five > 0 && ten > 0) {
                    five--;
                    ten--;
                } else if (five >= 3) {
                    five -= 3;
                } else {
                    return false;
                }
            }
        }
        return true;
    }
}
时间复杂度为O(n),注意分情况一种一种情况,依次讨论。

方法:模拟情景

思路与算法

让我们尝试模拟给每个购买柠檬水的顾客进行找零的过程。最初,我们从没有 5 美元钞票也没有 10 美元钞票的情况开始。

  • 如果顾客支付了 5 美元钞票,那么我们就得到 5 美元的钞票。

  • 如果顾客支付了 10 美元钞票,我们必须找回一张 5 美元钞票。如果我们没有 5 美元的钞票,答案就是 false,因为我们无法正确找零。

  • 如果顾客支付了 20 美元钞票,我们必须找回 15 美元。

    • 如果我们有一张 10 美元和一张 5 美元,那么我们总会更愿意这样找零,这比用三张 5 美元进行找零更有利。

    • 否则,如果我们有三张 5 美元的钞票,那么我们将这样找零。

    • 否则,我们将无法给出总面值为 15 美元的零钱,答案是 false

 

posted @ 2018-08-04 16:12  WangAlice  阅读(276)  评论(0编辑  收藏  举报