【算法】贪心算法——柠檬水找零

题解:柠檬水找零(贪心算法)

目录

1.题目

题目链接:LINK

2.题解

分情况讨论 + 贪心算法

  • 当顾客为5元时,收下
  • 当顾客为10元时,收下10元并找回5元
  • 当顾客为20元时,收下20元并找回10+5元或者5+5+5元

这里仅20元时候找钱会有分歧,所以这里我们用贪心算法,即优先留下尽可能多的5元,尽快把10元扔出去。

原因:5元是"万金油",既可以给10元找零,也可以给20元找零,但是10元就不能给10元找零。

3.参考代码

cpp 复制代码
class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        //哈希数组
        int arr[2] = {0};
        //0:5元 1:10元
        for(auto& money: bills)
        {
            if(money == 5) arr[0]++;
            else if(money == 10) arr[1]++,arr[0]--;// 收钱 + 找钱
            else
            {
                //收钱
                arr[2]++;
                
                //找钱
                if(arr[1] >= 1 && arr[0] >= 1) arr[1]--,arr[0]--;
                else arr[0]-=3;
            } 

            if(arr[0] < 0) return false;
        }

        return true;
    }
};

4.证明

证明思路:交换论证法

如果最优解和贪心解可以相互交换,即证明贪心解法有效。

注:最优解这里可以认为一定正确的解法。

因为在顾客给5元或者10元时候,找钱策略是唯一的,因而没有区别,我们这里只讨论顾客给20元的场景。

如果顾客给20元,

贪心算法:10 + 5元

最优解:5+5+5(可能,我们讨论最优解也为10 + 5的没意义)

如果这样,区别就在于一个10元的问题。

当这个10元在后面没有用,那么贪心解和最优解一致,因为这个10元没有用。

当这个10元在后面用到了,无非就是下面这种情况,可以看到无非贪心解和最优解顺序不一样而已。

在某种程度上,我觉得贪心算法一定是正确解法的一种,所以这个题贪心算法是正确的。

5.总结


EOF

相关推荐
独自破碎E7 分钟前
【前缀和+哈希】LCR_011_连续数组
算法·哈希算法
fqbqrr14 分钟前
2601C++,复制超文本格式
c++
一条大祥脚14 分钟前
26.1.26 扫描线+数论|因子反演+子序列计数|树套树优化最短路
数据结构·算法
m0_5613596716 分钟前
基于C++的机器学习库开发
开发语言·c++·算法
星空露珠23 分钟前
速算24点所有题库公式
开发语言·数据库·算法·游戏·lua
2401_8324027524 分钟前
C++中的类型擦除技术
开发语言·c++·算法
努力学习的小廉33 分钟前
我爱学算法之—— 递归回溯综合(二)
开发语言·算法
sheji526134 分钟前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
2301_7634724634 分钟前
C++网络编程(Boost.Asio)
开发语言·c++·算法
依依yyy39 分钟前
沪深300指数收益率波动性分析与预测——基于ARMA-GARCH模型
人工智能·算法·机器学习