『LeetCode|每日一题』---->柠檬水找零

目录

每日一句

作者简介

『LeetCode|每日一题』柠檬水找零

1.每日一题

2.解题思路 

        2.1 思路分析

        2.2 核心代码(贪心)

        2.3 完整代码

        2.4 运行结果

        2.5 补充说明


每日一句

年轻是我们唯一拥有权力去编织梦想的时光

作者简介

🏡个人主页:XiaoChen_Android

📚学习专栏:力扣专栏

🕒发布日期:2022/8/21

在这里插入图片描述

『LeetCode|每日一题』柠檬水找零

1.每日一题

原文链接--->快看我

2.解题思路 

        2.1 思路分析

LeetCode把这题放在了贪心部分,我认为贪心的地方在于尽可能少用五元的零钱,即能用十元的就必须先用十元的

        S1:首先要定义两个变量或者一个数组来保存我们零钱的数量,这里我定义了一个change数组,刚开始数量都为0;

        S2:由题可知,客户买柠檬水有三种支付情况,所以我们要分三种情况来讨论:

  1. 当客户支付5元时:此时我们不需要找零钱,并且我们的五元的零钱数量加一;
  2. 当客户支付10元时:我们只有一种找零方法,所以五元的零钱减一,别忘了十元的零钱要加一;
  3. 当用户支付20元时:我们可以找三张五元或者找一张五元和一张十元的,但是我们可以这么想,五元的零钱是万能的(啥时候都能用),十元的零钱只有在支付20元的时候可以用,所以我们这种情况要优先用一张十元和一张五元来找零  ; 

        S3:判断每种情况不能找零成功的情况:

  1. 当客户支付5元时:此时的情况不需要找零,所以不会有失败的情况;
  2. 当客户支付10元时:如果此时我们没有五元的零钱,那么一定找零失败;
  3. 当用户支付20元时:如果此时五元的零钱数量小于三张或者没有一张五元的和一张十元的,此时找零也一定失败;

        S4:如果失败的情况都没有发生,那么一定找零成功             

        2.2 核心代码(贪心)

        for(int i = 0; i < len ; i++){
            if(bills[i] - 5 == 0){      //支付五元
                change[0] += 1;
            }else if(bills[i] - 5 == 5){        //支付十元
                if(change[0] == 0){
                    return false;
                }
                change[0] -= 1;
                change[1] += 1;
            }else if(bills[i] - 5 == 15){       //支付20元
                if(change[0] >= 1 && change[1] >= 1){    //先用10元的零钱(贪心)
                    change[0] -= 1;
                    change[1] -= 1;
                }else if(change[0] >= 3){
                    change[0] -= 3;
                }else {
                    return false;
                }
            }
        }

        2.3 完整代码

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int[] change = new int[2];     //代表5,10的钱的数量
        for(int i = 0; i < 2; i++){
            change[i] = 0;
        }
        int len = bills.length;
        for(int i = 0; i < len ; i++){
            if(bills[i] - 5 == 0){      //支付五元
                change[0] += 1;
            }else if(bills[i] - 5 == 5){        //支付十元
                if(change[0] == 0){
                    return false;
                }
                change[0] -= 1;
                change[1] += 1;
            }else if(bills[i] - 5 == 15){       //支付20元
                if(change[0] >= 1 && change[1] >= 1){
                    change[0] -= 1;
                    change[1] -= 1;
                }else if(change[0] >= 3){
                    change[0] -= 3;
                }else {
                    return false;
                }
            }
        }
        return true;

    }
}

        2.4 运行结果

         2.5 补充说明

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int[] change = new int[2];     //代表5,10,20的钱的数量
        for(int i = 0; i < 2; i++){
            change[i] = 0;
        }
        if(bills[0] == 10 || bills[0] == 20) return false;
        int len = bills.length;
        for(int i = 0; i < len ; i++){
            if(bills[i] - 5 == 0){
                change[0] += 1;
            }else if(bills[i] - 5 == 5){
                if(change[0] == 0){
                    return false;
                }
                change[0] -= 1;
                change[1] += 1;
            }else if(bills[i] - 5 == 15){
                if(change[0] >= 3){
                    change[0] -= 3;
                }else if(change[0] >=1 && change[1] >= 1){
                    change[0] -= 1;
                    change[1] -= 1;
                }else {
                    return false;
                }
            }
        }
        return true;

    }
}

错误的情况就是因为判断条件中,顺序执行,所以先用的三张五元的来找零,以至于后面只有十元的或者五元的零钱数量不够等情况,会导致原本可以找零成功却失败了,所以到这个时候我才明白了贪心之处在于对五元零钱的尽量保留

读者可以自己举例试试这种错误的情况


🍁 类似题目推荐:

1.数据结构学习计划 

2.算法专项练习

3.剑指offer专项练习

4.推荐一个学习网站:LeetCode,算法的提升在于日积月累,只有每天练习才能保持良好的状态

如果文章对你有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值