zoukankan      html  css  js  c++  java
  • leetcode-860-柠檬水找零

    题目描述:

    在柠檬水摊上,每一杯柠檬水的售价为 5 美元。

    顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

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

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

    如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

    示例 1:

    输入:[5,5,5,10,20]
    输出:true
    解释:
    前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
    第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
    第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
    由于所有客户都得到了正确的找零,所以我们输出 true。
    

    示例 2:

    输入:[5,5,10]
    输出:true
    

    示例 3:

    输入:[10,10]
    输出:false
    

    示例 4:

    输入:[5,5,10,10,20]
    输出:false
    解释:
    前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。
    对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。
    对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。
    由于不是每位顾客都得到了正确的找零,所以答案是 false。
    

    提示:

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

     

    要完成的函数:

    bool lemonadeChange(vector<int>& bills) 

    说明:

    1. 给定一个vector,里面装着前来购买5元柠檬水的顾客给的钱,只可能会给5元/10元/20元,而你要给他们找零。

    初始的时候,你手里面只有柠檬水,而没有任何零钱。如果你能顺利完成所有找零工作(意味着第一个顾客只能给5元,方便你后续找零),那么返回true,如果不能完成所有找零工作,返回false。

    2. 这道题也不难,我们定义三个int变量,存储当前5元有多少张,10元有多少张,20元有多少张。

    每次有顾客来,判断要找多少零钱,检查一下当前的零钱能不能还,可以就找零,接着下一个顾客。

    在找零的过程中,当顾客给了20元,我们优先使用10元和5元的组合找零给顾客,而不是3张5元。

    因为5元的零钱更为重要,当顾客使用10元的时候,我们只能找零5元零钱。

    如果优先使用3张5元去找零,那么极有可能最终剩下一大堆10元,而当顾客掏出10元购买柠檬水,我们却没有5元零钱来找零。

    代码如下:

        bool lemonadeChange(vector<int>& bills) 
        {
            int five=0,ten=0,twenty=0;//定义三个变量,存储每种零钱有几张
            for(int money:bills)
            {
                if(money==5)//如果给了5元,那么不用找零,更新变量就好了
                    five++;
                else if(money==10)//如果给了10元,那么判断是否有5元零钱
                {
                    if(five>=1)
                        five--;
                    else
                        return false;
                    ten++;
                }
                else//如果给了20元,先判断是否有10元和5元的组合
                {
                    if(ten>=1 && five>=1)
                    {
                        ten--;
                        five--;
                    }
                    else if(five>=3)//如果没有10元和5元的组合,那么使用3张5元
                        five-=3;
                    else //如果都没有,那么返回false
                        return false;
                    twenty++;
                }
            }
            return true;//顺利完成所有找零工作,返回true
        }

    上述代码实测16ms,beats 73.27% of cpp submission。

    后记:发现了其实我们也可以不用统计twenty的个数,因为完全不需要用twenty去找零……

  • 相关阅读:
    LeetCode Merge Two Sorted Lists 归并排序
    LeetCode Add Binary 两个二进制数相加
    LeetCode Climbing Stairs 爬楼梯
    034 Search for a Range 搜索范围
    033 Search in Rotated Sorted Array 搜索旋转排序数组
    032 Longest Valid Parentheses 最长有效括号
    031 Next Permutation 下一个排列
    030 Substring with Concatenation of All Words 与所有单词相关联的字串
    029 Divide Two Integers 两数相除
    028 Implement strStr() 实现 strStr()
  • 原文地址:https://www.cnblogs.com/chenjx85/p/9265271.html
Copyright © 2011-2022 走看看