目录
每日一句
年轻是我们唯一拥有权力去编织梦想的时光
作者简介
🏡个人主页:XiaoChen_Android
📚学习专栏:力扣专栏
🕒发布日期:2022/8/21
『LeetCode|每日一题』柠檬水找零
1.每日一题
2.解题思路
2.1 思路分析
LeetCode把这题放在了贪心部分,我认为贪心的地方在于尽可能少用五元的零钱,即能用十元的就必须先用十元的
S1:首先要定义两个变量或者一个数组来保存我们零钱的数量,这里我定义了一个change数组,刚开始数量都为0;
S2:由题可知,客户买柠檬水有三种支付情况,所以我们要分三种情况来讨论:
- 当客户支付5元时:此时我们不需要找零钱,并且我们的五元的零钱数量加一;
- 当客户支付10元时:我们只有一种找零方法,所以五元的零钱减一,别忘了十元的零钱要加一;
- 当用户支付20元时:我们可以找三张五元或者找一张五元和一张十元的,但是我们可以这么想,五元的零钱是万能的(啥时候都能用),十元的零钱只有在支付20元的时候可以用,所以我们这种情况要优先用一张十元和一张五元来找零 ;
S3:判断每种情况不能找零成功的情况:
- 当客户支付5元时:此时的情况不需要找零,所以不会有失败的情况;
- 当客户支付10元时:如果此时我们没有五元的零钱,那么一定找零失败;
- 当用户支付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;
}
}
错误的情况就是因为判断条件中,顺序执行,所以先用的三张五元的来找零,以至于后面只有十元的或者五元的零钱数量不够等情况,会导致原本可以找零成功却失败了,所以到这个时候我才明白了贪心之处在于对五元零钱的尽量保留
读者可以自己举例试试这种错误的情况
🍁 类似题目推荐:
如果文章对你有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!