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

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

目录

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

相关推荐
choumin14 分钟前
C++中万能引用与std::forward的作用和用法
c++·万能引用·std forward
下一站春风里1 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
DRobot1 小时前
【机械制图与CAD实战(二十五)】螺纹的表示方法
算法·机械制图
用户老李2 小时前
卡尔曼滤波自学教程 10:无迹卡尔曼滤波(UKF)
算法
深圳市益普科技有限公司3 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
努力努力再努力wz4 小时前
【C++高阶系列】C++20 协程底层原理:函数为什么能暂停?从状态机到 Task,彻底串起挂起、恢复与协程调度
开发语言·c++·c++20·1024程序员节
程序员清风4 小时前
算法题中的边界条件、测试与调试
开发语言·算法·kotlin
划破黑暗的第一缕曙光4 小时前
[C++]:4.模板
c++·template·模板·函数模版·类模版
十五年专注C++开发4 小时前
pybind11:一个跨C++和Python平台的编程库
开发语言·c++·python·pybind11
CodeYp20194 小时前
第11讲:stack 和 queue
开发语言·c++·queue·stack