leetcode 860. Lemonade Change(python)

362 阅读1分钟

描述

At a lemonade stand, each lemonade costs $5.

Customers are standing in a queue to buy from you, and order one at a time (in the order specified by bills).

Each customer will only buy one lemonade and pay with either a 5,5, 10, or 20bill.Youmustprovidethecorrectchangetoeachcustomer,sothatthenettransactionisthatthecustomerpays20 bill. You must provide the correct change to each customer, so that the net transaction is that the customer pays 5.

Note that you don't have any change in hand at first.

Return true if and only if you can provide every customer with correct change.

Example 1:

Input: [5,5,5,10,20]
Output: true
Explanation: 
From the first 3 customers, we collect three $5 bills in order.
From the fourth customer, we collect a $10 bill and give back a $5.
From the fifth customer, we give a $10 bill and a $5 bill.
Since all customers got correct change, we output true.	

Example 2:

Input: [5,5,10]
Output: true

Example 3:

Input: [10,10]
Output: false

Example 4:

Input: [5,5,10,10,20]
Output: false
Explanation: 
From the first two customers in order, we collect two $5 bills.
For the next two customers in order, we collect a $10 bill and give back a $5 bill.
For the last customer, we can't give change of $15 back because we only have two $10 bills.
Since not every customer received correct change, the answer is false.

Note:

0 <= bills.length <= 10000
bills[i] will be either 5, 10, or 20

解析

根据题意,就是按照 bills 中的顺序进行换零钱,每个人只支付 5 块,你如果手里现有的钱可以找零则继续进行下一位,如果不能找零直接返回 False 。思路很简单,就是用字典 collect 来对 5 、10 、20 这三种货币进行计数,如果出现 5 ,则直接对 collect[5] 加一,如果出现 10 ,则判断 collect[5] 是否大于零,这表示可以给 10 块找零,如果出现 20 ,则判断是否 collect[5] 大于零且 collect[10] 大于零,或者 collect[5] 大于等于 3 ,表示可以给 20 找零,如果出现不可以找零情况直接返回 False ,否则最后返回 True 。

解答

class Solution(object):
    def lemonadeChange(self, bills):
        """
        :type bills: List[int]
        :rtype: bool
        """
        if len(bills) == 0:
            return True
        if bills[0] != 5:
            return False
        collect = {5: 1, 10: 0, 20: 0}
        for bill in bills[1:]:
            if bill == 5:
                collect[5] += 1
            elif bill == 10:
                if collect[5] > 0:
                    collect[5] -= 1
                    collect[10] += 1
                else:
                    return False
            elif bill == 20:
                if collect[10] > 0 and collect[5] > 0:
                    collect[10] -= 1
                    collect[5] -= 1
                    collect[20] += 1
                    continue
                elif collect[5] >= 3:
                    collect[5] -= 3
                    collect[20] += 1
                    continue
                else:
                    return False
        return True
        	      
		

运行结果

Runtime: 116 ms, faster than 50.63% of Python online submissions for Lemonade Change.
Memory Usage: 13.5 MB, less than 85.00% of Python online submissions for Lemonade Change.

原题链接:leetcode.com/problems/le…

您的支持是我最大的动力