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

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

目录

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

相关推荐
博笙困了5 分钟前
AcWing学习——差分
c++·算法
NAGNIP8 分钟前
认识 Unsloth 框架:大模型高效微调的利器
算法
NAGNIP9 分钟前
大模型微调框架之LLaMA Factory
算法
echoarts9 分钟前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Python技术极客15 分钟前
一款超好用的 Python 交互式可视化工具,强烈推荐~
算法
徐小夕19 分钟前
花了一天时间,开源了一套精美且支持复杂操作的表格编辑器tablejs
前端·算法·github
小刘鸭地下城31 分钟前
深入浅出链表:从基础概念到核心操作全面解析
算法
青草地溪水旁37 分钟前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(2)
c++·设计模式·抽象工厂模式
青草地溪水旁38 分钟前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(1)
c++·设计模式·抽象工厂模式
小刘鸭地下城41 分钟前
哈希表核心精要:从 O(1) 原理到链式地址与开放寻址
算法