2023-07-22 LeetCode每日一题(柠檬水找零)

2023-07-22每日一题

一、题目编号

860. 柠檬水找零

二、题目链接

点击跳转到题目位置

三、题目描述

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

注意,一开始你手头没有任何零钱。

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

提示:

  • 1 <= bills.length <= 105
  • bills[i] 不是 5 就是 10 或是 20

四、解题代码

class Solution {
    
public:
    bool lemonadeChange(vector<int>& bills) {
        int five = 0;
        int ten = 0;
        int twenty = 0;
        int n = bills.size();
        for(int i = 0; i < n; ++i){
            int num = bills[i];
            while(num > 20 && twenty){
                num -= 20;
                --twenty;
            }
            while(num > 10 && ten){
                num -= 10;
                --ten;
            }
            while(num > 5 && five){
                num -= 5;
                --five;
            }
            if(num != 5){
                return false;
            }
            if(bills[i] == 5){
                ++five;
            } else if(bills[i] == 10){
                ++ten;
            } else{
                ++twenty;
            }
        }
    return true;
    }
};
public class Solution {
    public bool LemonadeChange(int[] bills) {
        int five = 0;
        int ten = 0;
        int twenty = 0;
        int n = bills.Length;
        for(int i = 0; i < n; ++i){
            int num = bills[i];
            while(num > 20 && twenty > 0){
                num -= 20;
                --twenty;
            }
            while(num > 10 && ten > 0){
                num -= 10;
                --ten;
            }
            while(num > 5 && five > 0){
                num -= 5;
                --five;
            }
            if(num != 5){
                return false;
            }
            if(bills[i] == 5){
                ++five;
            } else if(bills[i] == 10){
                ++ten;
            } else{
                ++twenty;
            }
        }
    return true;
    }
}

五、解题思路

(1) 首先,这道题目采用贪心的策略来解决问题。

(2) 我们思考如何贪,我们要针对顾客给出的价格找零,现在我们有三种货币,但是这三种货币我们不确定有没有,那么我们该怎么找零,先试试看20的能不能找,因为20的能用2张10元的和4张5元的代替。如果没有20或者不需要20(顾客给出的钱小于20),那么就不用20。接着用相同的思路用10元的找,接着用5元的,直到5元的都找不干净(比如对面给出20,我们只有一个5元,还差10元)。

(3) 最后不要忘记,每次顾客给出的钱我们也需要记录到零钱当中,比如顾客给5元,最终就++five,++ten和++twenty同理。

(4) 如果能成功找零就输出true即可。本题目给出了C++和C#的代码。

你可能感兴趣的:(LeetCode每日一题,leetcode,算法,数据结构)