問題描述
連結:https://leetcode.com/problems/unique-binary-search-trees/description/
Given an integer n
, return the number of structurally unique BST's (binary search trees) which has exactly n
nodes of unique values from 1
to n
.
解釋:
給定一個整數n,求1~n,n個整陣列成的二叉搜尋樹的個數
基本思想
構造長度為n+1的動態陣列dp,其中dp[i] 表示 以i為中心的二叉搜尋樹的個數。假設
1~i個數中,
- 以1為為中心的,其左邊有數0個,右邊有樹i-1個,所以以1為中心,i個數,可以構成二叉搜尋樹 dp[1]* dp[i-1]
- 以2為中心,其左邊有數1個,右邊有樹i-2個,可以構成二叉搜尋樹為 左邊1個數可以構成的二叉搜尋樹 乘上 右邊 i-2個數可以構成的二叉搜尋樹
- ....
- 以i為中心,其左邊有 i-1個數,右邊有1個數,可以構成二叉搜尋樹的個數為 dp[i-1] * dp[1]
將上面結果依次疊加,即得到1~i個數構成的二叉搜尋樹的數目
時間複雜度 \(O(n^2)\) 需要計算3+4+....n次乘法
程式碼
C++
int numTrees(int n) {
if(n<=1) return 1;
if (n<=2) return 2;
vector<int> dp(n+1,0);
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for(int i=3;i<=n;++i) {
int t = 0;
for(int j=1;j<=i;++j) {
t += dp[j-1] * dp[i-j];
}
dp[i] = t;
}
return dp[n];
}
python
def numTrees(self, n: int) -> int:
if n <=0 : return 0
if n<=1: return 1
dp = [0] * (n+1)
dp[0] = dp[1] = 1
dp[2] = 2
for i in range(3, n+1):
for j in range(1,i+1):
dp[i] += dp[j-1] * dp[i-j]
return dp[n]