Easy
Related Topics: Array / Greedy
LeetCode Source
題目主要是希望透過 5 10 20 來交易價值為 5 的 lemonade
如果有錢可以找回傳 true 反之回傳 false
比較需要注意的是在 20 的時候
觀察有無 10 可以找
如果沒有需要考慮 3 個 5 是否可以找
過程中只需要紀錄 5 跟 10 的個數即可
Time Complexity: O(n)
Space Complexity: O(1)
class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        dict = {5: 0, 10: 0}
        for i in range(len(bills)):
            if bills[i] == 5:
                dict[5] += 1
            elif bills[i] == 10:
                if dict[5] == 0:
                    return False
                dict[5] -= 1
                dict[10] += 1
            else:
                if dict[10] == 0:
                    if dict[5] < 3:
                        return False
                    dict[5] -= 3
                else:
                    if dict[5] == 0:
                        return False
                    dict[5] -= 1
                    dict[10] -= 1
        return True
class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        unordered_map<int, int> mp;
        mp[5] = 0;
        mp[10] = 0;
        for (int i = 0; i < bills.size(); i++) {
            if (bills[i] == 5)
                mp[5] += 1;
            else if (bills[i] == 10) {
                if (mp[5] == 0)
                    return false;
                mp[5] -= 1;
                mp[10] += 1;
            } else {
                if (mp[10] == 0) {
                    if (mp[5] < 3)
                        return false;
                    mp[5] -= 3;
                } else {
                    if (mp[5] == 0)
                        return false;
                    mp[5] -= 1;
                    mp[10] -= 1;
                }
            }
        }
        return true;
    }
};