私はLeetCode質問を解決しています。質問です:1...n
から値を格納する構造的にユニークな分探索木を生成することができますどのように多くのn
考えるデカルト固有のBSTの数を求めるデカルト積を使った直観
、?
1 3 3 2 1
\ / / /\ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
最大upvoted溶液はDPを利用して、次の再帰式:
G(n) = G(0) * G(n-1) + G(1) * G(n-2) + … + G(n-1) * G(0)
G(n)
次のようにために、例えば、n=3
ため、5
ユニーク分探索木の合計を生成することができますn
に対して生成できる一意のBSTの数を表します。コードは次のとおりです。
class Solution {
public:
int numTrees(int n) {
vector<int> G(n+1);
G[0]=G[1]=1;
for(int i=2; i<=n; i++)
for(int j=1; j<=i; j++)
G[i]+=G[j-1]*G[i-j];
return G[n];
}
};
を、多かれ少なかれ、私は何が起こっているかを理解しないが、我々はより直感的である直積(代わりに、単純な加算を取る理由は、私は理解していませんでした)。私の理解あたりとして:
G[i] += G[j-1] * G[i-j];
は、代わりに次のようになります。
G[i] += G[j-1] + G[i-j]; //replaced '*' with a '+'
、私は現在のルートとしてi
で可能なユニークな分探索木の数が合計(あるべきだと思うので、これはそうでしょうか? )の左および右のサブツリーのBSTの数を示します。私はいくつかの例を試しましたが、どういうわけか数字は元の解答(*
)で魔法のように掛け合わされ、最終的な答えはG[n]
に現れます。
合計の代わりにデカルト積を使用するための直観的な説明を提供してもらえますか?
注:元の質問はhereで解決はhereです。また、元のコードはJavaで書かれていますが、私が上で書いたC++のバリエーションを投稿しています。
あなたは理解していますか、私は別のやりかたを試みたり、事を明確にすることはできますか? – coderredoc
@コーデルドック、ありがとう。私はあなたの意見を持っています。私はあなたの助けに感謝します。 –