From f4b65b300ecd5c533a30598e519a18e47d692b9e Mon Sep 17 00:00:00 2001 From: Hiro Funatsuka Date: Sat, 16 May 2026 22:59:35 +0900 Subject: [PATCH] Solve coin change --- 322_coin_change/problem.md | 1 + 322_coin_change/step1.md | 28 ++++++++++++++++++++++++++++ 322_coin_change/step2.md | 19 +++++++++++++++++++ 322_coin_change/step3.md | 21 +++++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 322_coin_change/problem.md create mode 100644 322_coin_change/step1.md create mode 100644 322_coin_change/step2.md create mode 100644 322_coin_change/step3.md diff --git a/322_coin_change/problem.md b/322_coin_change/problem.md new file mode 100644 index 0000000..48b0fda --- /dev/null +++ b/322_coin_change/problem.md @@ -0,0 +1 @@ +## 問題: [322. Coin Change](https://leetcode.com/problems/coin-change/description/) diff --git a/322_coin_change/step1.md b/322_coin_change/step1.md new file mode 100644 index 0000000..0378ef1 --- /dev/null +++ b/322_coin_change/step1.md @@ -0,0 +1,28 @@ +# Step 1 + +- 部分問題を解く + - base case: amountが0のときに必要なコインの枚数は0 + - $dp[amount]=min(dp[amount], 1 + dp[amount - coin])$ + - amountにするのに必要な最小のコインの枚数は、amountからコインを引いた分にするのに必要な最小のコインの枚数に1を足したものである + +```python +class Solution: + def coinChange(self, coins: List[int], amount: int) -> int: + dp = [float('inf')] * (amount + 1) + dp[0] = 0 + + for i in range(1, amount + 1): + for coin in coins: + if i - coin >= 0: + dp[i] = min(dp[i], 1 + dp[i - coin]) + + return dp[amount] if dp[amount] != float('inf') else -1 +``` + +時間計算量: $O(nm)$ + +空間計算量: $O(m)$ + +$n$: $coins$のサイズ + +$m$: $amount$の大きさ diff --git a/322_coin_change/step2.md b/322_coin_change/step2.md new file mode 100644 index 0000000..aba3e26 --- /dev/null +++ b/322_coin_change/step2.md @@ -0,0 +1,19 @@ +# Step 2 + +```python +class Solution: + def coinChange(self, coins: List[int], amount: int) -> int: + min_coins = [float('inf')] * (amount + 1) + min_coins[0] = 0 + + for sub_amount in range(1, amount + 1): + for coin in coins: + if sub_amount - coin >= 0: + min_coins[sub_amount] = min(min_coins[sub_amount], 1 + min_coins[sub_amount - coin]) + + return min_coins[amount] if min_coins[amount] != float('inf') else -1 +``` + +時間計算量: $O(nm)$ + +空間計算量: $O(m)$ diff --git a/322_coin_change/step3.md b/322_coin_change/step3.md new file mode 100644 index 0000000..d5ba684 --- /dev/null +++ b/322_coin_change/step3.md @@ -0,0 +1,21 @@ +# Step 3 + +```python +class Solution: + def coinChange(self, coins: List[int], amount: int) -> int: + min_coins = [float('inf')] * (amount + 1) + min_coins[0] = 0 + + for sub_amount in range(1, amount + 1): + for coin in coins: + if sub_amount - coin >= 0: + min_coins[sub_amount] = min(min_coins[sub_amount], 1 + min_coins[sub_amount - coin]) + + return min_coins[amount] if min_coins[amount] != float('inf') else -1 +``` + +1回目: 2分 48秒 + +2回目: 2分 41秒 + +3回目: 1分 49秒