贪心算法-860.柠檬水找零-力扣(LeetCode)
一、题目解析
我们需要注意我们是没有初始零钱的,所以当第一个顾客支付10或20时,无法找零此时返回false。
二、算法解析
根据贪心算法的解决方式,我们需要先把解决该问题分解为若干步。
首先对于顾客支付的钱共有三种,5,10,20,我们需要对其分别讨论。
当顾客支付5元时,我们直接收下,用于当做零钱使用。
当顾客支付10元时,我们要先判断是否有零钱补,如果没有则返回false,有则补5元。
当顾客支付20元时,我们有两种补钱方式(这里就用到了贪心),一种是10+5,另一种是5+5+5.
当20,10的时候,用了下面种补钱方式,10元就无法补钱,所以优先使用10+5的补钱方式,其次是5+5+5的补钱方式,如果两种都不满足,则返回false。
这里可以根据原理实现代码,链接:860. 柠檬水找零 - 力扣(LeetCode) 证明在结尾,如果有兴趣可以看看。
三、代码示例
class Solution {
public:bool lemonadeChange(vector<int>& bills) {int a = 0,b = 0;//a代表5元的张数,b代表10元的张数for(int i = 0;i<bills.size();i++){if(bills[0] == 10 || bills[0] == 20) return false;if(bills[i] == 5) a++;if(bills[i] == 10){if(a != 0){a--;b++;}else return false;}if(bills[i] == 20){if(a>=1 && b>= 1)//贪心{a--;b--;}else if(a>=3){a -= 3;}else return false;}}return true;}
};
四、证明
为什么贪心解就是最优解呢?这需要用数学的证明方法来证明。
看到最后,如果对您有帮助还请留下一个免费的赞和收藏,小编感激不尽,我们下期再见!