力扣860-柠檬水找零
一、原题题目
1.1 题目
在柠檬水摊上,每一杯柠檬水的售价为 5
美元。顾客排队购买你的产品,(按账单 bills
支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5
美元、10
美元或 20
美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5
美元。
注意,一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。
1.2 示例
示例1:
输入:
[5,5,5,10,20]
输出:true
解释: 前3
位顾客那里,我们按顺序收取3
张5
美元的钞票。
第4
位顾客那里,我们收取一张10
美元的钞票,并返还5
美元。
第5
位顾客那里,我们找还一张10
美元的钞票和一张5
美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出true
。示例2:
输入:
[5,5,10]
输出:true
示例3:
输入:
[10,10]
输出:false
示例4:
输入:
[5,5,10,10,20]
输出:false
解释: 前2
位顾客那里,我们按顺序收取2
张5
美元的钞票。
对于接下来的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
这个变量没有用到,故在上述代码中没有添加。之后也去参考了其他的题解,这个题好像也没啥可优化的啦~
三、总结
最近贪心题目做的有点勤呀!能马上感觉到这个是贪心就满足了,至少说明对贪心有点理解啦~加油!