At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you and order one at a time (in the order specified by bills). Each customer will only buy one lemonade and pay with either a $5, $10, or $20 bill. You must provide the correct change to each customer so that the net transaction is that the customer pays $5.

Note that you do not have any change in hand at first.

Given an integer array bills where bills[i] is the bill the ith customer pays, return true if you can provide every customer with the correct change, or false otherwise.

&nbsp;
Example 1:

Input: bills = [5,5,5,10,20]
Output: true
Explanation: 
From the first 3 customers, we collect three $5 bills in order.
From the fourth customer, we collect a $10 bill and give back a $5.
From the fifth customer, we give a $10 bill and a $5 bill.
Since all customers got correct change, we output true.


Example 2:

Input: bills = [5,5,10,10,20]
Output: false
Explanation: 
From the first two customers in order, we collect two $5 bills.
For the next two customers in order, we collect a $10 bill and give back a $5 bill.
For the last customer, we can not give the change of $15 back because we only have two $10 bills.
Since not every customer received the correct change, the answer is false.


&nbsp;
Constraints:


	1 &lt;= bills.length &lt;= 105
	bills[i] is either 5, 10, or 20.


class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:

        change = {5:0,10:0}
        for i in bills:
            if i==5:
                change[5]+=1
            elif i==10:
                if change[5]>0:
                    change[5]-=1
                    change[10]+=1
                else:
                    return False
            else:
                if (change[10]>0) & (change[5]>0):
                    change[10]-=1
                    change[5]-=1
                elif change[5]>=3:
                    change[5]-=3
                else:
                    return False
        return True
class Solution {
    public boolean lemonadeChange(int[] bills) {
        int count5 = 0, count10 = 0;
        for(int p : bills){
            if(p == 5){
                count5++;
            }
            else if(p == 10){
                if(count5 > 0){
                    count5--;
                    count10++;
                }
                else{
                    return false;
                }
            }
            else if(p == 20){
                if(count5 > 0 && count10 > 0){
                    count5--;
                    count10--;
                }
                else if(count5 == 0){
                    return false;
                }
                else if(count5<3){
                    return false;
                }
                else{
                    count5 -= 3;
                }
            }
        }
        return true;
    }
}
class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        unordered_map<int, int> m;
        
        int change = 0;
        for(int i = 0 ; i < bills.size(); i++)
        {
            m[bills[i]]++;
            
            if(bills[i] > 5)
            {
                change = bills[i] - 5;
                
                if(change == 5)
                {
                    if(m[5] > 0)
                    {
                        m[5]--;
                    }
                    else
                    {
                        return false;
                    }
                }
                //change = 10
                else
                {
                    if(m[10] > 0 and m[5] > 0)
                    {
                        m[10]--;
                        m[5]--;
                    }
                    else if(m[5] >= 3)
                    {
                        m[5] -= 3;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }
        
        return true;
    }
};
 * @param {number[]} bills
 * @return {boolean}
 */
var lemonadeChange = function(bills) {
   let cashLocker = {
    "5": 0,
    "10": 0,
    
  }
  for (let i = 0; i < bills.length; i++) {
    if (bills[i] === 5) {
      cashLocker["5"] += 1;
    } else if (bills[i] === 10 && cashLocker["5"] > 0) {
      cashLocker["5"] -= 1;
      cashLocker["10"] += 1;

    } else if (bills[i] === 20 && cashLocker["5"] >= 1 && cashLocker["10"] >= 1) {
      cashLocker["5"] -= 1;
      cashLocker["10"] -= 1;
     
    } else if (bills[i] === 20 && cashLocker["5"] >= 3) {

      cashLocker["5"] -= 3;
     
    } else {
      return false;
    }
  }

  return true;
    
};
Lemonade Change