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

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

目录

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

相关推荐
源码方舟34 分钟前
【基于ALS模型的教育视频推荐系统(Java实现)】
java·python·算法·音视频
吃个早饭1 小时前
2025年第十六届蓝桥杯大赛软件赛C/C++大学B组题解
c语言·c++·蓝桥杯
fancy1661661 小时前
力扣top100 矩阵置零
人工智能·算法·矩阵
元亓亓亓2 小时前
LeetCode热题100--240.搜索二维矩阵--中等
算法·leetcode·矩阵
阿沁QWQ2 小时前
单例模式的两种设计
开发语言·c++·单例模式
六bring个六2 小时前
qtcreater配置opencv
c++·qt·opencv·计算机视觉·图形渲染·opengl
qwertyuiop_i2 小时前
pe文件二进制解析(用c/c++解析一个二进制pe文件)
c语言·c++·pe文件
明月看潮生3 小时前
青少年编程与数学 02-019 Rust 编程基础 09课题、流程控制
开发语言·算法·青少年编程·rust·编程与数学
oioihoii3 小时前
C++23 views::slide (P2442R1) 深入解析
linux·算法·c++23
yxc_inspire3 小时前
基于Qt的app开发第八天
开发语言·c++·qt