タイトル説明
整数nは、1 ... nは二分探索木のノードに求めている、何を考えますか?
アイデア解析
まず観察は、我々はシーケンス1-nは、根から選ばiは、1-iは左のサブツリーのは、中右部分木であるか見ることができる、私は別の根の数は、BSTの製品サブツリー異なる状況についてです。
例えば1234根から選択は、F(2,4)= O(1)* O(2)に対応する、2、左の部分木、右の部分木34を行います
この発見は、全体に拡大する、に見出すことができるO(N)=Σ
O(-I 1)* O(Ni)から。
再帰的なソリューションの複雑移動規制と、高いです。規制は小さな問題との両方を保存することができ、サブ問題の解決に大きな問題を移動することができます!
注:これは数Cartlandであることを発見するだけで解決を見てください。
コードの実装
public int numTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}