diff --git a/322/322.md b/322/322.md new file mode 100644 index 0000000..d7bf282 --- /dev/null +++ b/322/322.md @@ -0,0 +1,71 @@ +## 何も見ずに解いてみる + +```cpp +class Solution { +public: + int coinChange(vector& coins, int amount) { + vector viable_coins; + for (const int coin : coins) { + if (coin <= amount) { + viable_coins.push_back(coin); + } + } + vector fewest_coins(amount + 1, -1); + fewest_coins[0] = 0; + for (int i = 0; i < amount; ++i) { + if (fewest_coins[i] != -1) { + for (const int coin : viable_coins) { + if (i + coin <= amount) { + if (fewest_coins[i + coin] == -1) { + fewest_coins[i + coin] = fewest_coins[i] + 1; + } else { + fewest_coins[i + coin] = min(fewest_coins[i + coin], fewest_coins[i] + 1); + } + } + } + } + } + return fewest_coins.back(); + } +}; +``` + +最初viable_coinsは作らずにやっていたのだが +``` +1 <= coins[i] <= 2^31 - 1 +0 <= amount <= 10^4 +``` +この不思議な制約によりi + coin <= amountを計算するときにオーバーフローになってしまった。 + +ただ実際にはオーバーフローは結構気にかけないといけないなと思った。pythonでは気にしなくていいが他の言語では注意を回す癖をつけないといけない。 + +## 他の人のコードを見てみる + +https://github.com/ryosuketc/leetcode_arai60/pull/53/files +https://github.com/TORUS0818/leetcode/pull/42/files +https://github.com/tokuhirat/LeetCode/pull/40/files +https://github.com/hroc135/leetcode/pull/38/files +https://github.com/goto-untrapped/Arai60/pull/34/files + +「一つの変数に二つ以上の意味が含まれてるのはわかりにくい」というのは書いているときにも思った。 これを解決するためにintの上限などを持ち出すかは迷うところ・・・ + +## 最終コード +```cpp +class Solution { +public: + int coinChange(vector& coins, int amount) { + vector min_coins(amount + 1, -1); + min_coins[0] = 0; + for (int i = 0; i <= amount; ++i) { + if (min_coins[i] == -1) continue; + for (const int coin : coins) { + if (coin > amount - i) continue; + min_coins[i + coin] = min_coins[i + coin] == -1 + ? min_coins[i] + 1 + : min(min_coins[i + coin], min_coins[i] + 1); + } + } + return min_coins.back(); + } +}; +```