返回

你不应该错过的 leetcode 860 柠檬水找零指南

前端

导言

在柠檬水摊上,你面前排着一条顾客的队伍,他们依次购买柠檬水,每杯售价为 5 美元。顾客使用 5 美元、10 美元或 20 美元纸币向你付款。为了避免找零麻烦,你需要确定是否总是能够为顾客找零。

解决这个问题的關鍵在於你能否找到一种方法來管理找零,並確保你始終擁有足夠的零錢來滿足顧客的需求。

实现步骤

  1. 初始化变量

    int five_dollar_bills = 0;
    int ten_dollar_bills = 0;
    int twenty_dollar_bills = 0;
    
  2. 循环处理顾客付款

    for (int i = 0; i < bills.length; i++) {
        int bill = bills[i];
    
        // 处理 5 美元纸币
        if (bill == 5) {
            five_dollar_bills++;
        }
        // 处理 10 美元纸币
        else if (bill == 10) {
            if (five_dollar_bills > 0) {
                five_dollar_bills--;
                ten_dollar_bills++;
            } else {
                return false;  // 无法找零
            }
        }
        // 处理 20 美元纸币
        else if (bill == 20) {
            if (five_dollar_bills > 0 && ten_dollar_bills > 0) {
                five_dollar_bills--;
                ten_dollar_bills--;
                twenty_dollar_bills++;
            } else if (five_dollar_bills >= 3) {
                five_dollar_bills -= 3;
                twenty_dollar_bills++;
            } else {
                return false;  // 无法找零
            }
        }
    }
    
  3. 检查最终找零情况

    return five_dollar_bills >= 0 && ten_dollar_bills >= 0 && twenty_dollar_bills >= 0;
    

编程示例

JavaScript

/**
 * 判断是否能够为顾客找零。
 *
 * @param {number[]} bills 顾客付款的金额
 * @return {boolean} 是否能够找零
 */
const lemonadeChange = (bills) => {
    let five_dollar_bills = 0;
    let ten_dollar_bills = 0;
    let twenty_dollar_bills = 0;

    for (let i = 0; i < bills.length; i++) {
        const bill = bills[i];

        // 处理 5 美元纸币
        if (bill === 5) {
            five_dollar_bills++;
        }
        // 处理 10 美元纸币
        else if (bill === 10) {
            if (five_dollar_bills > 0) {
                five_dollar_bills--;
                ten_dollar_bills++;
            } else {
                return false;  // 无法找零
            }
        }
        // 处理 20 美元纸币
        else if (bill === 20) {
            if (five_dollar_bills > 0 && ten_dollar_bills > 0) {
                five_dollar_bills--;
                ten_dollar_bills--;
                twenty_dollar_bills++;
            } else if (five_dollar_bills >= 3) {
                five_dollar_bills -= 3;
                twenty_dollar_bills++;
            } else {
                return false;  // 无法找零
            }
        }
    }

    return five_dollar_bills >= 0 && ten_dollar_bills >= 0 && twenty_dollar_bills >= 0;
};

Python

def lemonade_change(bills):
    """
    判断是否能够为顾客找零。

    :param bills: 顾客付款的金额
    :return: 是否能够找零
    """
    five_dollar_bills = 0
    ten_dollar_bills = 0
    twenty_dollar_bills = 0

    for bill in bills:
        # 处理 5 美元纸币
        if bill == 5:
            five_dollar_bills += 1
        # 处理 10 美元纸币
        elif bill == 10:
            if five_dollar_bills > 0:
                five_dollar_bills -= 1
                ten_dollar_bills += 1
            else:
                return False  # 无法找零
        # 处理 20 美元纸币
        elif bill == 20:
            if five_dollar_bills > 0 and ten_dollar_bills > 0:
                five_dollar_bills -= 1
                ten_dollar_bills -= 1
                twenty_dollar_bills += 1
            elif five_dollar_bills >= 3:
                five_dollar_bills -= 3
                twenty_dollar_bills += 1
            else:
                return False  # 无法找零

    return five_dollar_bills >= 0 and ten_dollar_bills >= 0 and twenty_dollar_bills >= 0

Java

class Solution {
    /**
     * 判断是否能够为顾客找零。
     *
     * @param bills 顾客付款的金额
     * @return 是否能够找零
     */
    public boolean lemonadeChange(int[] bills) {
        int five_dollar_bills = 0;
        int ten_dollar_bills = 0;
        int twenty_dollar_bills = 0;

        for (int bill : bills) {
            // 处理 5 美元纸币
            if (bill == 5) {
                five_dollar_bills++;
            }
            // 处理 10 美元纸币
            else if (bill == 10) {
                if (five_dollar_bills > 0) {
                    five_dollar_bills--;
                    ten_dollar_bills++;
                } else {
                    return false;  // 无法找零
                }
            }
            // 处理 20 美元纸币
            else if (bill == 20) {
                if (five_dollar_bills > 0 && ten_dollar_bills > 0) {
                    five_dollar_bills--;
                    ten_dollar_bills--;
                    twenty_dollar_bills++;
                } else if (five_dollar_bills >= 3) {
                    five_dollar_bills -= 3;
                    twenty_dollar_bills++;
                } else {
                    return false;  // 无法找零
                }
            }
        }

        return five_dollar_bills >= 0 && ten_dollar_bills >= 0 && twenty_dollar_bills >= 0;
    }
}

C++

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five_dollar_bills = 0;
        int ten_dollar_bills = 0;
        int twenty_dollar_bills = 0;

        for (int bill : bills) {
            // 处理 5 美元纸币
            if (bill == 5) {
                five_dollar_bills++;
            }
            // 处理 10 美元纸币
            else if (bill == 10) {
                if (five_dollar_bills > 0) {
                    five_dollar_bills--;
                    ten_dollar_bills++;
                } else {
                    return false;  // 无法找零
                }
            }
            // 处理 20 美元纸币
            else if (bill == 20) {
                if (five_dollar_bills > 0 && ten_dollar_bills > 0) {
                    five_dollar_bills--;
                    ten_dollar_bills--;
                    twenty_dollar_bills++;
                } else if (five_dollar_bills >= 3) {
                    five_dollar_bills -= 3;
                    twenty_dollar_bills++;
                } else {
                    return false;  // 无法找零
                }
            }
        }

        return five_dollar_bills >= 0 && ten_dollar_