Lemonade Change
Greedy — always return the largest bill first when making change.
3 min read
greedy array
Problem#
Customers pay 10, or 5 lemonade. You start with no change. Return true iff you can give exact change to every customer.
Examples#
[5,5,5,10,20]→true.[5,5,10,10,20]→false.
Constraints#
1 <= bills.length <= 10^5.
Approach#
Track counts of 10 bills. On 5. On 10 + one 5.
Solution#
class Solution {public: bool lemonadeChange(vector<int>& bills) { int five = 0, ten = 0; for (int b : bills) { if (b == 5) ++five; else if (b == 10) { if (!five) return false; --five; ++ten; } else { if (ten && five) { --ten; --five; } else if (five >= 3) five -= 3; else return false; } } return true; }};func lemonadeChange(bills []int) bool { five, ten := 0, 0 for _, b := range bills { switch b { case 5: five++ case 10: if five == 0 { return false } five-- ten++ default: if ten > 0 && five > 0 { ten-- five-- } else if five >= 3 { five -= 3 } else { return false } } } return true}from typing import List
class Solution: def lemonadeChange(self, bills: List[int]) -> bool: five, ten = 0, 0 for b in bills: if b == 5: five += 1 elif b == 10: if five == 0: return False five -= 1 ten += 1 else: if ten > 0 and five > 0: ten -= 1 five -= 1 elif five >= 3: five -= 3 else: return False return Truefunction lemonadeChange(bills) { let five = 0, ten = 0; for (const b of bills) { if (b === 5) { five++; } else if (b === 10) { if (five === 0) return false; five--; ten++; } else { if (ten > 0 && five > 0) { ten--; five--; } else if (five >= 3) { five -= 3; } else { return false; } } } return true;}class Solution { public boolean lemonadeChange(int[] bills) { int five = 0, ten = 0; for (int b : bills) { if (b == 5) { five++; } else if (b == 10) { if (five == 0) return false; five--; ten++; } else { if (ten > 0 && five > 0) { ten--; five--; } else if (five >= 3) { five -= 3; } else { return false; } } } return true; }}function lemonadeChange(bills: number[]): boolean { let five = 0, ten = 0; for (const b of bills) { if (b === 5) { five++; } else if (b === 10) { if (five === 0) return false; five--; ten++; } else { if (ten > 0 && five > 0) { ten--; five--; } else if (five >= 3) { five -= 3; } else { return false; } } } return true;}Editorial#
Preferring to give a 5s for cases that need them. This is the only safe choice — a 20 customer.
Complexity#
- Time:
O(n). - Space:
O(1).
Concept revision#
Related#