力扣860-柠檬水找零


力扣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 这个变量没有用到,故在上述代码中没有添加。之后也去参考了其他的题解,这个题好像也没啥可优化的啦~

三、总结

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


文章作者: ItDaChuang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ItDaChuang !
评论
 上一篇
力扣62-不同路径 力扣62-不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 Start )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 Finish )。问总共有多少条不同的路径?
2020-12-25
下一篇 
力扣455-分发饼干 力扣455-分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
2020-12-25
  目录