力扣860. 柠檬水找零

题目来源(力扣):

https://leetcode.cn/problems/lemonade-change/description/

题目描述:

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元(只有这3种情况)。
你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
判断能否完成找零钱的任务。

基本思路:

贪心算法入门级难度题目,找钱时优先给大额的,之后再次大额的,最后才是小额钞票。
例如现在手上有10元1张,5元2张。
接下来需要找零10元、5元。
如果先把小额钞票2张5元凑成10元找给顾客了,则没有更多小额钞票来满足小额度找零了。

所以应该优先使用大额钞票

代码实现:

class Solution
{
public:
    bool lemonadeChange(vector<int> &bills)
    {
        int big = 0, mid = 0, small = 0; // 20 10 5
        for (int i = 0; i < bills.size(); i++)
        {
            if (bills[i] == 5)
            {
                small++;
            }
            else if (bills[i] == 10)
            {
                mid++;
                small--;
            }
            else
            {
                // big++;
                if (mid)
                { // 优先使用大额钞票找零钱
                    mid--, small--;
                }
                else
                    small -= 3;
            }
            if (small < 0)
                return 0;
        }
        return 1;
    }
};

时间复杂度

O(n)

posted @ 2024-11-15 15:54  HB_Computer  阅读(34)  评论(0)    收藏  举报