代码是自己码的,应该算是一个最基础的思路和代码编写过程,本人自己也是初学者。欢迎大家指正交流
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
注意,一开始你手头没有任何零钱。
给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lemonade-change
贪心解法:
个人思路:
因为顾客是按照顺序来的,所以必须来一个就要找零一个,如果不行,那么后面的也不用看,直接false就好。
可以设置两个变量,分别记录10元和5元的数量,再每一次找零之后判断10元和5元的数量是否为负数,若为负数,
则说明数量不够,即无法找零所以输出false;若能进行到最后,则输出true;
第一次的代码:
class Solution {
public boolean lemonadeChange(int[] bills) {
int len=bills.length;
int m5=0,m10=0,m20=0;
for(int i=0;i<len;i++)
{
if(bills[i]==5) m5++;
if(bills[i]==10) {
m10++;
m5--;
if(m5<0)return false;
}
if(bills[i]==20){
m20++; //*这个地方没必要,因为20不会用来找零,所以没必要计数
/**********这里是贪心的关键*******************/
if(m10>0)
{m10--; //如果有10元,就用10元,如果没有,再用5元。(局部最优解)
m5--;}
else if(m5>=3){
m5-=3;
}
/**********************************************/
else return false;
}
}
if(m5>=0&&m10>=0)return true; //这里直接return true;
return false; // 因为循环里已经判断过了
}
}
改进:
试了一下不太对;
大家可以找一下错误
class Solution {
public boolean lemonadeChange(int[] bills) {
int len=bills.length;
int m5=0,m10=0;
for(int i=0;i<len;i++)
{
if(bills[i]==5) m5++;
if(bills[i]==10) {
m10++;
m5--;
if(m5<0)return false;
}
if(bills[i]==20){
if(m10>0)
{m10--;
m5--;}
else if(m5>=3){
m5-=3;
}
else return false;
}
}
return true;
}
}
正确的改进:
class Solution {
public boolean lemonadeChange(int[] bills) {
int len=bills.length;
int m5=0,m10=0;
for(int i=0;i<len;i++)
{
if(bills[i]==5) m5++;
if(bills[i]==10) {
m10++;
m5--;
if(m5<0)return false;
}
if(bills[i]==20){
if(m10>0)
{m10--;
m5--;}
else m5-=3;
if(m5<0)return false;
}
}
return true;
}
}
可以使用另一种for循环来表示(会让代码更简洁一点):
class Solution {
public boolean lemonadeChange(int[] bills) {
int m5=0,m10=0;
for(int i:bills)
{
if(i==5) m5++;
if(i==10) {
m10++;
m5--;
if(m5<0)return false;
}
if(i==20){
if(m10>0)
{m10--;
m5--;}
else m5-=3;
if(m5<0)return false;
}
}
return true;
}
}