をタイムアウトない私のコードです:はなぜ322コインの変更をleetcodeする私の解決策はここ
class Solution {
std::unordered_map<int, int> um;
public:
int coinChange(vector<int>& coins, int amount) {
if (amount == 0)
return 0;
auto it = um.find(amount);
if (it != um.end())
return it->second;
int ret = -1;
for (int c : coins)
{
int n = 1;
while (true)
{
int a = amount - n * c, m = 0;
if (a < 0)
break;
if (a > 0)
m = coinChange(coins, a);
if (m != -1)
{
if (ret == -1)
ret = m + n;
else
ret = std::min(ret, m + n);
}
n++;
}
}
um[amount] = ret;
return ret;
}
};
私の知る限り、それはほとんどのupvotedソリューションに非常に似ている、それも同じハッシュテーブルを構築します。しかし、私は任意の入力でタイムアウトを取得します。 私はローカルでエラーを見つけることができません。
何が間違っている可能性がありますか?
編集:
私は、問題文を含める:
あなたが異なる宗派や金額の合計額のコインを与えられています。その額を補うために必要なコインの数を計算する関数を書く。コインの組み合わせによってその金額を補うことができない場合は、-1を返します。
例: コイン= [1、2、5]、量= 11 リターン3(11 = 5 + 5 + 1)
アプローチ:
使用動的プログラミング(再帰+メモ化)。ある金額の場合は、金額がプラスである限りすべてのコインを試してください。上記の例の場合:
S(11) = 1 + S(10) | 2 + S(9) | 3 + S(8) | ... | 11 + S(0) | //try coin 1
1 + S(9) | 2 + S(7) | 3 + S(5) | ... | 5 + S(1) | //try coin 2
1 + S(6) | 2 + S(1) //try coin 5
恩赦この質問の周りの混乱は、私は上記のアイデアの私の実装はいくつかのバグを持っていると考えているが、私は困難な時期にそれを見つけることがあります。
いつでも0にすることはできますか?コードが0の場合、コードは永遠にループしているように見えます。 – drescherjm
デバッガを使用してコードを実行してみてください... – mame98
ソフトウェア開発者のキャリアを追求する場合は、それらの偽の_プログラマブルなプログラミングサイトから遠ざかることをお勧めします。彼らは有毒な知識を広め、何も貢献しません。 – Ron