Given n, how many structurally unique BST's (binary search trees) that store values 1...n?
For example,
Given n = 3, there are a total of 5 unique BST's.
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
解題思路:
首先解釋一下題目的意思,題目要求是給定數(shù)字序列1....n,求出可能的二叉搜索樹的個數(shù)。
本題可以采用動態(tài)規(guī)劃的方法來解決。具體公式[F(i, n) = G(i-1) * G(n-i)]。
給定一個序列1.....n, 來構(gòu)造一個BST, 我們可以枚舉系列中的每個數(shù)字i, 然后使用i作為根節(jié)點,很自然的,子序列1....(i-1)可以構(gòu)成i的左子樹,而(i+1)....n可以構(gòu)成i的右子樹,而且左子樹和右子樹葉都是BST.通過上面的方法,我們可以確保所構(gòu)造的BST都是不同的,因為根節(jié)點是不同的。
為了求出不同的BST的個數(shù),我們定義以下兩個函數(shù):
* G(N): 給定數(shù)字序列1....n, 求出可能的二叉樹的個數(shù)。
* F(i, n) , i <= i <= n, 給定數(shù)字i, 并且數(shù)字i作為根節(jié)點,求出可能的二叉樹個數(shù)。
根據(jù)以上兩個定義的函數(shù),可以得出G(n)就是題目的解,而G(n)可以通過求解F(i,n)得到,具體公式為:
G(n) = F(1, n) + F(2, n) + ... + F(n, n). '
G(0) = 1, G(1) = 1.
給定一個序列1.....n, 選擇i作為BST的根節(jié)點,則二叉樹的個數(shù)為:F(i,n)。 為了求F(i,n), 我們將F(i,n)拆分為左子樹的個數(shù)和右子樹的個數(shù),因此可以得到以下公式:
F(i,n) = G(i-1) *(n-i) 1<= i <= n
具體代碼如下:
class Solution {
public:
int numTrees(int n) {
if(n == 0) return 0;
if(n == 1) return 1;
vector<int> ret(n+1,0);//增加第零個元素,所以size為n+1
ret[0] = 1;
ret[1] = 1;
for(int i = 2; i <= n; ++i)
{
for(int j = 1; j <= i; ++j)
ret[i] += ret[j-1] * ret[i-j];
}
return ret[n];
}
};
參考資料:https://discuss.leetcode.com/topic/8398/dp-solution-in-6-lines-with-explanation-f-i-n-g-i-1-g-n-i