The Indian Engineer

Problem 860 Lemonade Change

Posted on 3 mins

Greedy Array

Problem Statement

Link - Problem 860

Question

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.

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.

Constraints

- `1 <= bills.length <= 10^5`
- `bills[i] is either 5, 10, or 20.`

Solution

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        std::ios::sync_with_stdio(false);
        int five = 0, ten = 0;
        for(int &it:bills){
            if(it == 5){
                five++;
            }
            else if(it == 10){
               if(five>0){
                ten++;
                five--;
               }
               else{
                return false;
               }
            }
            else{
                if(ten>0 && five>0){
                    ten--;
                    five--;
                }
                else if(five>2){
                    five-=3;
                }
                else{
                    return false;
                }
            }
            //cout<<five<<" "<<ten<<endl;
        }
        return true;
    }
};

Complexity Analysis

| Algorithm | Time Complexity | Space Complexity |
| --------- | --------------- | ---------------- |
| Greedy    | O(N)            | O(1)             |

Explanation

1. Intuition

- We need to keep track of the way the change is given.
- In real life, we always try to give the change by using higher denominations first.
- We can use the same approach here.
- We can keep track of the number of 5's and 10's we have.
- If 20 is given, we can give 10+5 or 5+5+5.
- If 10 is given, we can give 5.
- If 5 is given, we can keep it.
- If we can't give the change, we return false.
- If we can give the change to all customers, we return true.

2. Implementation

- Initialize `five` and `ten` to 0.
- Iterate over the bills.
- If the bill is 5, increment `five`.
- If the bill is 10, check if we have 5's.
  - If we have 5's, increment `ten` and decrement `five`.
  - If we don't have 5's, return false.
- If the bill is 20, check if we have 10's and 5's.
  - If we have 10's and 5's, decrement `ten` and `five`.
  - If we have 5's, decrement `five` by 3.
  - If we don't have 10's and 5's, return false.
- Return true.