贪心算法-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) 证明在结尾,如果有兴趣可以看看。

三、代码示例

cpp 复制代码
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;
    }
};

四、证明

为什么贪心解就是最优解呢?这需要用数学的证明方法来证明。

看到最后,如果对您有帮助还请留下一个免费的赞和收藏,小编感激不尽,我们下期再见!

相关推荐
R-G-B13 分钟前
【25】MFC入门到精通——MFC静态文本框 中字符串 连续输出 不覆盖先前的文本 换行输出
c++·mfc·mfc静态文本框输出字符串·mfc静态文本框连续输出字符串·mfc静态文本框换行输出字符串
我搞slam18 分钟前
快乐数--leetcode
算法·leetcode·哈希算法
WWZZ20251 小时前
快速上手大模型:机器学习3(多元线性回归及梯度、向量化、正规方程)
人工智能·算法·机器学习·机器人·slam·具身感知
东方佑2 小时前
从字符串中提取重复子串的Python算法解析
windows·python·算法
西阳未落2 小时前
LeetCode——二分(进阶)
算法·leetcode·职场和发展
通信小呆呆2 小时前
以矩阵视角统一理解:外积、Kronecker 积与 Khatri–Rao 积(含MATLAB可视化)
线性代数·算法·matlab·矩阵·信号处理
FFZero12 小时前
【C++/Lua联合开发】 (二) Lua调用C++函数
c++·junit·lua
CoderCodingNo3 小时前
【GESP】C++四级真题 luogu-B4068 [GESP202412 四级] Recamán
开发语言·c++·算法
一个不知名程序员www3 小时前
算法学习入门---双指针(C++)
c++·算法
Maple_land4 小时前
常见Linux环境变量深度解析
linux·运维·服务器·c++·centos