↓快轉到主要內容
  1. LeetCode/

LeetCode 860: Lemonade Change

·2 分鐘· ·
LeetCode Easy Array Greedy
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-09-17

  • 提交紀錄:Runtime Error → Wrong Answer ×2 → Runtime Error → Wrong Answer → Runtime Error → Wrong Answer ×3 → Runtime Error → Wrong Answer → Runtime Error → Accepted ×5

解題思路
#

要記的是每種面額的張數,不是總金額:有 10 元也找不開 5 元。收到 5 元直接收下;收到 10 元要找一張 5 元;收到 20 元要找 15 元,貪心優先用 10 + 5,沒有才用 5 + 5 + 5(Greedy):5 元能找 10 元和 20 元,10 元只能找 20 元,所以要盡量留 5 元。20 元找不出去,不用記。

我的嘗試
#

這題提交了 17 次:

  • 一開始只記總金額:第一版連收進來的錢都沒加上,[5, 10] 回傳 False;第二版加上了,但 [5, 10, 10] 手上只有一張 10 元,找不開第三個人的 5 元,回傳 True。總金額夠不代表找得開。
  • 改成用 dict 記面額後,一版把「找零失敗」的 return False 放在 else,不需要找零的 5 元也走到了 else:[5] 回傳 False。
  • 有幾版的 key 用的是要找的錢 b - 5 而不是收到的面額,收到 10 元時記成 balance[5],等於自己找自己:[10] 回傳 True。改用面額當 key 後又遇到 key 不存在的 KeyError。
  • 最後改成兩個整數 c5、c10 才 AC。

正確解法
#

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        five = ten = 0
        for b in bills:
            if b == 5:
                five += 1
            elif b == 10:
                if five == 0:
                    return False
                five, ten = five - 1, ten + 1
            elif ten and five:
                ten, five = ten - 1, five - 1
            elif five >= 3:
                five -= 3
            else:
                return False
        return True

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 記張數,不是總金額。
  • 用收到的面額當 key,不是要找的錢。
  • 找 15 元先用 10 + 5。

面試口說整理
#

我只記 5 元和 10 元的張數,收到 10 元找一張 5 元,收到 20 元優先找 10 加 5,因為 5 元能用在更多情況,沒有才找三張 5 元,找不開就回傳 False。時間 O(n)。

相關文章

LeetCode 605: Can Place Flowers
·1 分鐘
LeetCode Easy Array Greedy
LeetCode 605 解題筆記:從左到右,左右都空的空格就種下去;種下去的花會擋住下一格,要真的更新陣列
LeetCode 561: Array Partition
·1 分鐘
LeetCode Easy Array Greedy Sorting Counting-Sort
LeetCode 561 解題筆記:排序後相鄰兩個一組,每組的最小值就是偶數位置的數,加總
LeetCode 455: Assign Cookies
·1 分鐘
LeetCode Easy Array Two-Pointers Greedy Sorting
LeetCode 455 解題筆記:小孩和餅乾都排序,用最小的、夠大的餅乾滿足最小的小孩;兩個指標各走一次
LeetCode 867: Transpose Matrix
·1 分鐘
LeetCode Easy Array Matrix Simulation
LeetCode 867 解題筆記:轉置後的大小是 n × m,res[j][i] = matrix[i][j];Python 可以用 zip(*matrix)
LeetCode 821: Shortest Distance to a Character
·1 分鐘
LeetCode Easy Array Two-Pointers String
LeetCode 821 解題筆記:左往右掃一次記錄到左邊最近的 c 的距離,右往左再掃一次取較小值
LeetCode 832: Flipping an Image
·1 分鐘
LeetCode Easy Array Two-Pointers Bit-Manipulation Matrix
LeetCode 832 解題筆記:每一列先左右反轉再把 0、1 互換;可以用左右指針同時做