LeetCode860. Lemonade Change

文章目录

一、题目

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 billsi 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

billsi is either 5, 10, or 20.

二、题解

cpp 复制代码
class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int n = bills.size();
        vector<int> balance(3,0);
        for(int i = 0;i < n;i++){
            int sub = bills[i] - 5;
            if(sub == 5 && balance[0] == 0) return false;
            else if(sub == 15 && (balance[0] == 0 || (balance[1] == 0 && balance[0] < 3))) return false;
            if(sub == 5) balance[0]--;
            else if(sub == 15){
                if(balance[1] > 0) balance[0]--,balance[1]--;
                else balance[0] -= 3;
            }
            if(bills[i] == 5) balance[0]++;
            else if(bills[i] == 10) balance[1]++;
            else balance[2]++;
        }
        return true;
    }
};

更好的解法

cpp 复制代码
class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int n = bills.size();
        int five = 0,ten = 0,twenty = 0;
        for(int i = 0;i < n;i++){
            if(bills[i] == 5) five++;
            else if(bills[i] == 10){
                if(five == 0) return false;
                ten++;
                five--;
            }
            else if(bills[i] == 20){
                if(five > 0 && ten > 0) five--,ten--;
                else if(five >= 3 && ten == 0) five -= 3;
                else return false;
            }
        }
        return true;
    }
};
相关推荐
ShineWinsu1 小时前
对于C++:IO流状态的详细解析
c++·面试·io·cin·io流状态·goodbit·failbit
数模竞赛Paid answer2 小时前
2026年中青杯数学建模A题数学建模论文智能评估系统与多智能体优化方法求解全过程论文及程序
算法·数学建模·中青杯
银-豆豆2 小时前
数据结构与算法-动态规划、回溯与贪心
算法·动态规划
Lzg_na3 小时前
constexpr的优势
c++
想吃火锅10054 小时前
【leetcode】200. 岛屿数量
算法·leetcode·职场和发展
王维同学4 小时前
进程模块枚举、映像身份与线程启动地址关联
c++·windows·安全
hold?fish:palm4 小时前
24 回文链表
数据结构·c++·链表
举手4 小时前
Dispatcher模块剖析
linux·c++
Nil2085 小时前
leetcode 54螺旋矩阵
算法·leetcode·矩阵
依然鸣5 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论