力扣860-柠檬水找零(又一道贪心入门题,你学废了吗?Java详细题解)

力扣860-柠檬水找零

一、原题题目

1.1 题目

  在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

  注意,一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

1.2 示例

  • 示例1:

    输入: [5,5,5,10,20]
    输出: true
    解释:3 位顾客那里,我们按顺序收取 35 美元的钞票。
    4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
    5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
    由于所有客户都得到了正确的找零,所以我们输出 true

  • 示例2:

    输入: [5,5,10]
    输出: true

  • 示例3:

    输入: [10,10]
    输出: false

  • 示例4:

    输入: [5,5,10,10,20]
    输出: false
    解释:2 位顾客那里,我们按顺序收取 25 美元的钞票。
    对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。
    对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。
    由于不是每位顾客都得到了正确的找零,所以答案是 false

提示:

  • 0 <= bills.length <= 10000
  • bills[i] 不是 5 就是 10 或是 20

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lemonade-change

二、解题思路

2.1 贪心思路解题

  • 解题思路

  读完题目我又感觉这是一道贪心的题,都有点怀疑自己啦!这几天看到题老是想到贪心。这里我用三个变量 five ten twenty 来存储手头上拥有的 5 美元,10 美元,20 美元钞票的数量,当遍历账单时,按如下规则处理:

  • 5 美元:不用找零,直接 five + 1

  • 10 美元:必须要找零一个 5 美元,如果有即 five > 0 ,则 five - 1 ,否则返回 false

  • 20 美元:必须找零 15 美元,尽可能的先找一个 10 美元,再找一个 5 美元(贪心的体现)如果没有 10 美元的,则需要找三个 5 美元的,否则返回 false

    1.如果 five >= 1 && ten >= 1 ,则 five - 1 ,ten - 1
    2.如果 ten == 0 && five >= 3 ,则 five - 3
    3.否则返回 false

  • 详细代码(Java)

public class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0,ten = 0;                   // 定义两个用于找零面额钞票数量的变量
        for (int i = 0;i<bills.length;i++){     // 遍历每一个账单
            if (bills[i]==5)    five++;         // 当前账单为5美元,直接收下,不用找零
            if (bills[i]==10){                  // 当前账单为10美元
                if (five > 0) {                 // 有5美元的找
                    ten++;                      // 则收10美元
                    five--;                     // 找零5美元
                }
                else return false;              // 没有5美元的找则返回false
            }
            if (bills[i]==20){                  // 当前账单为20美元
                if (five>0&&ten>0){             // 有10美元和5美元的找
                    five--;                     // 找零一个10美元
                    ten--;                      // 找零一个5美元
                }
                else if (ten == 0&&five>2){     // 没有10美元只有足够5美元的找
                    five-=3;                    // 找零三个5美元
                }
                else return false;              // 没有可找零的方案返回false
            }
        }
        return true;
    }
}
  • 代码执行结果
算法执行结果

  写代码时发现 twenty 这个变量没有用到,故在上述代码中没有添加。之后也去参考了其他的题解,这个题好像也没啥可优化的啦~

三、总结

  最近贪心题目做的有点勤呀!能马上感觉到这个是贪心就满足了,至少说明对贪心有点理解啦~加油!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ItDaChuang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值