Skip to main content

Lemonade Change - Solution & Explanation

EasyArrayGreedy16 min readAsked at: Amazon, Microsoft, Meta +5
Practice this problem

Problem Statement

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 <= 105
  • bills[i] is either 5, 10, or 20.

Approach Overview

Problem Overview: You run a lemonade stand where each lemonade costs $5. Customers pay with $5, $10, or $20 bills in a given order. After every transaction you must return the correct change using only the bills you have received so far. The task is to determine whether you can serve every customer successfully.

Approach 1: Greedy with Bill Counting (O(n) time, O(1) space)

This problem is a classic greedy decision scenario. You only need to track how many $5 and $10 bills you currently hold. Iterate through the input array of payments and simulate each transaction. When a customer pays with $10, give one $5 as change. When they pay with $20, prioritize giving $10 + $5 if possible because it preserves smaller bills for future transactions; otherwise give three $5 bills. If neither option exists, the transaction fails. The greedy insight is that larger bills should be used for change first when possible to keep more flexible denominations available later.

This works because each decision only affects future flexibility, not past transactions. The algorithm performs a single pass through the array while maintaining two counters. No additional data structures are required, making the space usage constant.

Approach 2: Simulation with Priority Change Strategy (O(n) time, O(1) space)

This method explicitly simulates the cashier behavior and prioritizes higher denomination change using a structured strategy. Track counts of $5, $10, and optionally $20 bills. For each payment, compute the required change and attempt to fulfill it by greedily subtracting the largest available denominations first (for example $10 before $5). The process mirrors how a real register might compute change.

Although the behavior is similar to the greedy approach, this version frames the logic as a small change-making routine rather than a direct rule set. You repeatedly deduct bills from your counts until the required change is satisfied or impossible. The complexity remains linear because each transaction involves only a few constant-time checks.

Recommended for interviews: The greedy bill counting approach is what interviewers expect. It shows that you recognize the optimal strategy of preserving smaller denominations and can reason about local decisions leading to a globally valid solution. The simulation approach demonstrates the same idea but with slightly more overhead. Candidates who first describe the greedy reasoning and then implement the constant-space counters usually produce the cleanest solution.

Approach 1: Greedy with Bill Counting

This approach involves using a greedy strategy where we maintain counters for $5 and $10 bills. When a $5 bill is received, simply increase the count. For a $10 bill, check if you have a $5 bill to give as change. For a $20 bill, prefer giving one $10 and one $5 bill as change if available, otherwise give three $5 bills.

The C solution initializes counters for $5 and $10 bills. It iterates over the array and adjusts these counters based on the bill received, ensuring the correct change can be given. The function returns false if change cannot be provided at any point.

Code

C

C++

Java

Python

C#

JavaScript

Complexity

Time Complexity: O(n), where n is the length of the bills array.
Space Complexity: O(1), since only a fixed amount of additional space is used for counters.

Try this approach in the editor →

Approach 2: Simulation with Priority Change Strategy

This approach focuses on prioritizing the use of $10 bills when giving change to customers with $20 bills. By simulating the process, we ensure that change is handled with a clear order of preference, utilizing available higher denominations first.

The solution processes each bill, adjusting the count of $5 and $10 bills and preferring to give back a $10 bill when changing for a $20 bill. It returns false if it can't make the correct change.

Code

C

C++

Java

Python

C#

JavaScript

Complexity

Time Complexity: O(n), where n is the size of the bills array.
Space Complexity: O(1), using only fixed space for counters.

Try this approach in the editor →

Approach 3: Default Approach

Code

Python

Java

C++

Go

TypeScript

JavaScript

Rust

Try this approach in the editor →

Approach 4: One-liner

Code

TypeScript

JavaScript

Try this approach in the editor →

Complexity Comparison

ApproachComplexity
Greedy with Bill Counting

Time Complexity: O(n), where n is the length of the bills array.
Space Complexity: O(1), since only a fixed amount of additional space is used for counters.

Simulation with Priority Change Strategy

Time Complexity: O(n), where n is the size of the bills array.
Space Complexity: O(1), using only fixed space for counters.

Default Approach—
One-liner—

Detailed Complexity Analysis

ApproachTimeSpaceWhen to Use
Greedy with Bill CountingO(n)O(1)Best general solution. Minimal state tracking and expected in coding interviews.
Simulation with Priority Change StrategyO(n)O(1)Useful when modeling change-making logic explicitly or extending to more denominations.

Video Solution

L2. Lemonade Change | Greedy Algorithm Playlist • take U forward • 166,153 views views

Watch 9 more video solutions →

Frequently Asked Questions

Is Lemonade Change easy or hard?
Lemonade Change is classified as an Easy problem on LeetCode with around a 59% acceptance rate. The challenge is recognizing the greedy strategy and handling the $20 bill case correctly by prioritizing $10 + $5 change.
Lemonade Change Python/Java solution
Most implementations follow the same greedy logic across languages. Maintain variables for five and ten dollar bills, iterate through the payments array, and update counts while validating change availability. This results in an O(n) time and O(1) space implementation in Python, Java, C++, or JavaScript.
How to solve Lemonade Change in O(n)?
Iterate through the payments array and keep counters for $5 and $10 bills. For a $5 bill, increment the $5 counter. For a $10 bill, give one $5 as change if available. For a $20 bill, prefer giving $10 + $5 change; otherwise give three $5 bills. If neither option is possible, return false.
What is the best approach for Lemonade Change?
The greedy bill counting approach is the best solution. Track the number of $5 and $10 bills while iterating through the payments array. Always prioritize giving $10 + $5 change for a $20 bill when possible. This strategy runs in O(n) time with O(1) space and is the standard interview solution.
Is Lemonade Change asked at Google/Amazon/Meta?
Lemonade Change is a common entry-level greedy interview problem and has appeared in interview preparation lists for companies like Amazon and other tech firms. It tests reasoning about greedy decisions, state tracking, and simple transaction simulation.
What data structure is used in Lemonade Change?
The problem mainly uses simple counters to track available bills. The input is processed as an array, and the algorithm maintains integer counts for $5 and $10 denominations instead of complex data structures.
What is the time complexity of Lemonade Change?
The optimal solution runs in O(n) time where n is the number of customers. Each payment is processed exactly once with constant-time checks for available bills. The space complexity is O(1) because only a few counters are maintained.

Ready to solve this problem?

Practice Lemonade Change with our built-in code editor and test cases.

Practice on FleetCode