Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions 322_coin_change/problem.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
## 問題: [322. Coin Change](https://leetcode.com/problems/coin-change/description/)
28 changes: 28 additions & 0 deletions 322_coin_change/step1.md
Original file line number Diff line number Diff line change
@@ -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$の大きさ
19 changes: 19 additions & 0 deletions 322_coin_change/step2.md
Original file line number Diff line number Diff line change
@@ -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)$
21 changes: 21 additions & 0 deletions 322_coin_change/step3.md
Original file line number Diff line number Diff line change
@@ -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秒