[LeetCode] 860. Lemonade Change 买柠檬找零



At a lemonade stand, each lemonade costs $5html

Customers are standing in a queue to buy from you, and order one at a time (in the order specified by bills).git

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.github

Note that you don't have any change in hand at first.ide

Return true if and only if you can provide every customer with correct change.code

Example 1:htm

Input: [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:blog

Input: [5,5,10]
Output: true

Example 3:three

Input: [10,10]
Output: false

Example 4:ci

Input: [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't give change of $15 back because we only have two $10 bills.
Since not every customer received correct change, the answer is false.

Note:leetcode

  • 0 <= bills.length <= 10000
  • bills[i] will be either 510, or 20.



这道题说是有不少柠檬,每一个卖5刀,顾客可能会提供5刀,10刀,20刀的钞票,咱们刚开始的时候并无零钱,只有收到顾客的5刀,或者 10 刀能够用来给顾客找钱,固然若是第一个顾客就给 10 刀或者 20 刀,那么是没法找零的,这里就问最终是否可以都成功找零。博主最早想到的方法是首先用一个 HashMap 来分别统计出5刀,10 刀,和 20 刀钞票的个数,而后再来统一分析是否能成功找零。因为 10 刀的钞票须要5刀的找零,20 刀的钞票能够用1张 10 刀和1张5刀,或者3张5刀的钞票,因此至少须要1张5刀,那么当前5刀的个数必定不能小于 10 刀和 20 刀的个数以后,不然没法成功找零。因为 20 刀能够用 10 刀来找零,每一个 10 刀能够节省两个5刀,可是为了得到每张 10 刀,咱们还得付出一张5刀的找零,因此实际上用 10 刀来找零只能省下1张5刀钞票,可是假如 10 刀的个数不够,那么每张 20 刀的钞票仍是须要3张5刀的钞票来找零的,因此判断若5刀钞票的个数小于 20 刀钞票个数的三倍减去 10 刀钞票的个数,直接返回 false。for 循环退出后返回 true,参见代码以下:



解法一:

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        unordered_map<int, int> cnt;
        for (int bill : bills) {
            ++cnt[bill];
            if (cnt[5] < cnt[20] + cnt[10]) return false;
            if (cnt[5] < 3 * cnt[20] - cnt[10]) return false;
        }
        return true;
    }
};



实际上咱们并不须要一直保留全部钞票的个数,当某些钞票被看成零钱给了,就没有必要继续留着它们的个数了。其实上咱们只关心当前还剩余的5刀和 10 刀钞票的个数,用两个变量 five 和 ten 来记录。而后遍历全部的钞票,假如遇到5刀钞票,则 five 自增1,若遇到 10 刀钞票,则须要找零5刀,则 five 自减1,ten 自增1。不然遇到的就是 20 刀的了,若还有 10 刀的钞票话,就先用 10 刀找零,则 ten 自减1,再用一张5刀找零,five 自减1。若没有 10 刀了,则用三张5刀找零,five 自减3。找零了后检测若此时5刀钞票个数为负数了,则直接返回 false,参见代码以下:



解法二:

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five = 0, ten = 0;
        for (int bill : bills) {
            if (bill == 5) ++five;
            else if (bill == 10) { --five; ++ten; }
            else if (ten > 0) { --ten; --five; }
            else five -= 3;
            if (five < 0) return false;
        }
        return true;
    }
};



Github 同步地址:

https://github.com/grandyang/leetcode/issues/860



参考资料:

https://leetcode.com/problems/lemonade-change/

https://leetcode.com/problems/lemonade-change/discuss/143719/C%2B%2BJavaPython-Straight-Forward



LeetCode All in One 题目讲解汇总(持续更新中...)

相关文章
相关标签/搜索