Files
leetcode-master/problems/0860.柠檬水找零.md
youngyangyang04 3bc79d5538 Update
2020-12-11 09:50:08 +08:00

2.7 KiB
Raw Blame History

如果对贪心算法理论基础还不了解的话,可以看看这篇:关于贪心算法,你该了解这些! ,相信看完之后对贪心就有基本的了解了。

这道题目我们需要维护三种金额的数量510和20。

有如下三种情况:

  • 情况一账单是5直接收下。
  • 情况二账单是10消耗一个5增加一个10
  • 情况三账单是20优先消耗一个10和一个5如果不够在消耗三个5

这道题大家可能感觉纯模拟就可以了,其实这里有贪心,就在情况三中。

账单是20的情况为什么要优先消耗一个10和一个5呢

因为美元10只能给账单20找零而美元5可以给账单10和账单20找零美元5更万能

局部最优遇到账单20优先消耗美元10完成本次找零。全局最优完成全部账单的找零。

局部最优可以推出全局最优,并找不出反例,那么就试试贪心。

C++代码如下:

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five = 0, ten = 0, twenty = 0;
        for (int bill : bills) {
            // 情况一
            if (bill == 5) five++;
            // 情况二
            if (bill == 10) {
                if (five <= 0) return false;
                ten++;
                five--;
            }
            // 情况三
            if (bill == 20) {
                // 优先消耗10美元因为5美元的找零用处更大能多留着就多留着
                if (five > 0 && ten > 0) {
                    five--;
                    ten--;
                    twenty++; // 其实这行代码可以删了因为记录20已经没有意义了不会用20来找零
                } else if (five >= 3) {
                    five -= 3;
                    twenty++; // 同理,这行代码也可以删了
                } else return false;
            }
        }
        return true;
    }
};

我是程序员Carl,可以找我组队刷题,也可以在B站上找到我,本文leetcode刷题攻略已收录,更多精彩算法文章尽在公众号:代码随想录,关注后就会发现和「代码随想录」相见恨晚!

如果感觉题解对你有帮助,不要吝啬给一个👍吧!