96. Unique Binary Search Trees - cocoder39/coco39_LC GitHub Wiki
96. Unique Binary Search Trees
Consider DP when facing a "how many" problem.
f(n) = numTrees(n) g(i, n) is #bst rooted with i, where 1 <= i <= n 1. f(n) = g(1, n) + g(2, n) + .. g(n, n) 2. g(i, n) = f(i - 1) * f(n - i)
f(n) = f(0)*f(n-1) + f(1)*f(n-2) + .. f(n-1)*f(0)
= sum(f(i - 1) * f(n-i)) where 1 <= i <= n
f(0) = 1;
f(1) = 1
f(2) = f(0)*f(1) + f(1)*f(0) = 2
f(3) = f(0)f(2) + f(1)f(1) + f(2)f(0) = 5
int numTrees(int n) {
vector<int> nums(n+1, 0);
nums[0] = 1;
nums[1] = 1;
for(int i = 2; i <= n; i++){
for(int j = 0; j < i; j++){
nums[i] += nums[j] * nums[i-j-1];
}
}
return nums[n];
}
Same idea is used to solve unique bst ii