每日一道简单题(题目来源:leetcode)

代码是自己码的,应该算是一个最基础的思路和代码编写过程,本人自己也是初学者。欢迎大家指正交流

在柠檬水摊上,每一杯柠檬水的售价为 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值