跳至主要內容

860, 柠檬水找零

Mike大约 2 分钟greedyeasygreedyarray

一、题目描述

在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。

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

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

给你一个整数数组bills,其中bills[i]是第i位顾客付的账。如果你能给每位顾客正确找零,返回true,否则返回false

示例 1
输入: bills = [5, 5, 5, 10, 20]
输出: true
解释:
3位顾客那里,我们按顺序收取35美元的钞票。
4位顾客那里,我们收取一张10美元的钞票,并返还5美元。
5位顾客那里,我们找还一张10美元的钞票和一张5美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出true

示例 2
输入: bills = [5, 5, 10, 10, 20]
输出: false
解释:
2位顾客那里,我们按顺序收取25美元的钞票。
对于接下来的2位顾客,我们收取一张10美元的钞票,然后返还5美元。
对于最后一位顾客,我们无法退回15美元,因为我们现在只有两张10美元的钞票。
由于不是每位顾客都得到了正确的找零,所以答案是false

提示

  • 1 <= bills.length <= 10⁵
  • bills[i]不是5就是10或是20

相关主题

  • 贪心
  • 数组

二、题解

方法 1: 贪心

pub fn lemonade_change(bills: Vec<i32>) -> bool {
    let mut counter = [0; 3];

    for bill in bills {
        match bill {
            20 => { // 共找零15元
                if counter[1] == 0 {
                    // 没有10元,15 = 3 * 5
                    if counter[0] < 3 {
                        return false;
                    }
                    counter[0] -= 3;
                } else {
                    // 有10元,15 = 10 + 5
                    if counter[0] == 0 {
                        return false;
                    }
                    counter[0] -= 1;
                    counter[1] -= 1;
                }
                counter[2] += 1;
            }
            10 => { // 共找零5元
                if counter[0] == 0 {
                    return false;
                }
                counter[0] -= 1;
                counter[1] += 1;
            }
            _ => counter[0] += 1,
        }
    }

    true
}