吴师兄学算法day08 贪心 860. 柠檬水找零

题目:860. 柠檬水找零

易错点:

  • 我写的是if esle 哈哈,第一次还写错了。i ==20的时候,5元只找了1张。哈哈哈.应该找3张
  •  

我的代码:

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        dic = {5:0,10:0,20:0}

        for i in bills:
            if i== 5:
                dic[5] +=1  # 收入5元1张
                continue

            if i == 10:
                if dic[5]>= 1:    # 余额里有5元就继续
                    dic[10] = dic[10] + 1   # 增加收入
                    dic[5] = dic[5] - 1 # 找零
                else:
                    return False
                
            if i == 20:
                
                if dic[10]>=1 and dic[5]>=1:    # 找10元和5元的各一张
                    dic[10] = dic[10] - 1   # 找零10元1张
                    dic[5] = dic[5] -1      # 找零5元1张    
                    dic[20] = dic[20] + 1   # 进账20元1张
                    continue
                # 实在没招了,找5元的
                if dic[5] >=3:  # 如果有3张5元的,可以找开零钱
                    dic[20] = dic[20] + 1
                    dic[5] = dic[5] - 3 # 减去3张5元
                    continue
                else:   # 如果不满足,直接就结束了
                    return False
            
        # 能走到这里,说明都能找开零钱
        return True 

老师的代码:

# 登录 AlgoMooc 官网获取更多算法图解
# https:#www.algomooc.com
# 作者:程序员吴师兄
# 代码有看不懂的地方一定要私聊咨询吴师兄呀
# 柠檬水找零( LeetCode 860 ):https:#leetcode-cn.com/problems/lemonade-change/
class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        # 用来记录 5 元钞票的数量
        five = 0

        # 用来记录 10 元钞票的数量
        ten = 0

        # 顾客开始按顺序购买,并找零
        for i  in range(len(bills)) : 
            # 1、如果发现是 5 元面额
            if bills[i] == 5 :
                # 那么可以直接收钱,不需要找零
                # 并且 5 元钞票的数量加 1
                five += 1

                # 2、如果发现是 10 元面额
            elif bills[i] == 10 :

                # 如果手中有 5 元钞票,则找零 5 元
                if five > 0 :
                    # 5 元钞票的数量减 1
                    five -= 1
                    # 10 元钞票的数量加 1
                    ten += 1
                else : 
                    # 如果手中没有 5 元钞票,说明找零失败
                    return False
    
                # 3、如果发现是 20 元面额
            else : 

                # 如果手中有 10 元 和 5 元钞票,则找零 1 张 10 元和 1 张 5 元的钞票
                if ten > 0 and five > 0 :
                    # 5 元钞票的数量减 1
                    five -= 1
                    # 10 元钞票的数量减 1
                    ten -= 1
                else:
                    # 如果手中只有 5 元的,并且数量超过或者等于 3 张
                    # 那么找零 3 张 5 元的钞票
                    if five >= 3 : 
                        # 5 元钞票的数量减 3
                        five -= 3
                    else :
                        # 说明这个时候顾客付 20 元的时候
                        # 1、手中没有 1 张 10 元的和 1 张 5 元的
                        # 2、手中没有 3 张 5 元的
                        # 说明找零失败
                        return False

        # 所有顾客都找零了,成功
        return True

扩展写法:

总结:

  • 老师跟我写的差不多。。。哈哈

参考:

https://r07na4yqwor.feishu.cn/docx/FW37dJAfgo49iXxZnmccPmDinWc

posted @ 2024-01-19 18:26  o蹲蹲o  阅读(10)  评论(0编辑  收藏  举报