Leetcode # 518. Coin Change II
https://leetcode.com/problems/coin-change-ii
Solution: Top-Down DP
用 (amount, len(coins)) 作為 self.memo 的key
Time Complexity: O(n * amount)
Space Complexity: O(n * amount)
1 <= coins[i] <= 5000
n := len(coins)
time/space complexity = O(n * (amount / 1)) = O(n * amount)
(The input and output generally do not count towards the space complexity.)
class Solution: def __init__(self): self.memo = {} def change(self, amount: int, coins: List[int]) -> int: if not coins: return 1 if amount == 0 else 0 n = len(coins) if (amount, n) not in self.memo: _amount = amount remained_coins = coins[:-1] self.memo[amount, n] = self.change(_amount, remained_coins) while _amount >= coins[-1]: self.memo[amount, n] += \ self.change(_amount := _amount - coins[-1], remained_coins) return self.memo[amount, n]
Solution: Bottom DP, Optimized Space Complexity
用 (amount, len(coins)) 作為 self.memo 的key
Time Complexity: O(n * amount)
Space Complexity: O(n * amount)O(amount)
(The input and output generally do not count towards the space complexity.)
class Solution: def change(self, amount: int, coins: List[int]) -> int: if amount == 0: return 1 prev_dp, result = collections.Counter([amount]), 0 for i, coin in enumerate(coins): if i == len(coins) - 1: result += sum([prev_dp[remained] \ for remained in prev_dp if remained % coin == 0]) break curr_dp = prev_dp.copy() for remained in prev_dp: _remained = remained while _remained >= coin: _remained -= coin if _remained == 0: result += prev_dp[remained] else: curr_dp[_remained] += prev_dp[remained] prev_dp = curr_dp return result
More Concise Code
Ex: coins = [1, 2]
DP Table | Value | Coins Used |
dp[0] | 1 | [] |
dp[1] = dp[0 (1 – 1)] | 1 | [, 1] |
dp[2] = dp[1 (2 – 1)] + dp[0 (2 – 2)] | 2 | [1, 1] [, 2] |
dp[3] = dp[2 (3 – 1)] | 2 | [1, 1, 1] [2, 1] |
… | … | … |
class Solution: def change(self, amount: int, coins: List[int]) -> int: dp = [1] + [0] * amount for coin in coins: for _amount in range(coin, amount + 1): dp[_amount] += dp[_amount - coin] return dp[amount]
Last Updated on 2023/08/16 by A1go