アルゴリズムの重要性についてはこれ以上お話ししません。大きな工場に行きたい場合は、基本的な知識とビジネスロジックのインタビュー+アルゴリズムのインタビューを行う必要があります。したがって、みんなのアルゴリズム能力を向上させるために、この公式アカウントでは毎日アルゴリズムの質問をするようになり、質問はLeetCodeから選択されます!
今日お話ししている問題は、さまざまなバイナリ検索ツリーと呼ばれてい ます。最初に問題を見てみましょう。
https://leetcode-cn.com/problems/unique-binary-search-trees/
nが与えられた場合、値1 ... nを格納する構造的に一意のBST(二分探索木)はいくつありますか?
題名
整数nが与えられた場合、ノードとして1 ... nを持つバイナリ検索ツリーのタイプはいくつですか?
サンプル
問題解決
再帰的なサブ問題
nノードのバイナリソートツリーの数をG(n)とすると、f(i)をiをルートとするバイナリ検索ツリーの数とします。
G(n)= f(1)+ f(2)+ f(3)+ f(4)+ ... + f(n)、
f(i)= G(i−1)∗ G(n−i)
class Solution {
public int numTrees(int n) {
if (n == 0 || n == 1) return 1;
int res = 0;
for (int i = 1; i <= n; i++) {
res += numTrees(i - 1) * numTrees(n - i);
}
return res;
}
}
動的プログラミング
dp [0]から、dp [1]は徐々に後方に拡張します
public class Solution {
public int numTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 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];
}
}
さて、今日の記事は以上です。何かを得たと感じたら、それを読むか転送してください。あなたのサポートが私の最大の動機です。
上期推文:
LeetCodeブラシの質問実際の戦闘81:検索回転ソート配列II
LeetCodeブラッシングの質問実際の戦闘82:ソートされたリストIIの重複要素を削除する
LeetCodeプラクティス83:ソートされたリスト内の重複する要素を削除します
LeetCode Brush Questions in Action 84:ヒストグラムで最大の長方形
LeetCodeブラシの質問実際の戦闘86:個別のリンクリスト
LeetCodeプラクティス88:2つの順序付けられた配列を組み合わせる