860. 柠檬水找零

这篇博客介绍了如何使用贪心算法解决860.柠檬水找零问题。作者通过分析不同面值钞票找零的情况,提出了一种优化找零策略,优先考虑使用较少数量的钞票来完成找零,以减少5美元钞票的消耗。代码实现中,维护了5美元和10美元钞票的数量,并针对不同输入情况进行分类讨论,确保总能找到正确的找零方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

860. 柠檬水找零

题解:贪心算法

方法一:贪心

由于顾客只可能给你三个面值的钞票,而且我们一开始没有任何钞票,因此我们拥有的钞票面值只可能是 5 美元,10 美元和 20 美元三种。基于此,我们可以进行如下的分类讨论。

  • 5 美元,由于柠檬水的价格也为 5 美元,因此我们直接收下即可。

  • 10 美元,我们需要找回 5 美元,如果没有 5 美元面值的钞票,则无法正确找零。

  • 20 美元,我们需要找回 15 美元,此时有两种组合方式,一种是一张 10 美元和 5 美元的钞票,一种是 3 张 5 美元的钞票,如果两种组合方式都没有,则无法正确找零。当可以正确找零时,两种找零的方式中我们更倾向于第一种,即如果存在 5 美元和 10 美元,我们就按第一种方式找零,否则按第二种方式找零,因为需要使用 5 美元的找零场景会比需要使用 10 美元的找零场景多,我们需要尽可能保留 5 美元的钞票。

基于此,我们维护两个变量 fiveten 表示当前手中拥有的 5 美元和 10 美元钞票的张数,从前往后遍历数组分类讨论即可。

代码:贪心算法

public class lc_860 {

    public static boolean lemonadeChange(int[] bills) {
        int five = 0;
        int ten = 0;
        for(int i = 0; i < bills.length; i++)
        {
            if(bills[i] == 5)
            {
                five++;
            }
            else if(bills[i] == 10)
            {
                if(five == 0)
                {
                    return false;
                }
                ten++;
                five--;
            }
            else if(bills[i] == 20)
            {
                if(five > 0 && ten > 0)
                {
                    ten--;
                    five--;
                }
                else if(five >= 3)
                {
                    five -= 3;
                }
                else
                {
                    return false;
                }
            }
        }
        return true;
    }

    public static void main(String[] args) {
        int bills_1[] = {5, 5, 5, 10, 20};
        boolean res_1 = lemonadeChange(bills_1);
        System.out.println(res_1);

        int bills_2[] = {5, 5, 10, 10, 20};
        boolean res_2 = lemonadeChange(bills_2);
        System.out.println(res_2);
    }
}

参考:

  1. 柠檬水找零
  2. 「代码随想录」带你学透贪心算法!860. 柠檬水找零
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dev_zyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值