题目要求
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.
解题思路
使用一个一维数组来解决这个问题,数组cnt[i]
表示[1,2...i]
能构成多少种二叉查找树。
如果我们使用k
来作为树根的话,那么左子树是由[1,2,...,k-1]
构成的,右子树是由[k+1,...,i]
,知道这一点我们可以写出如下的状态转移方程:
for (int k = 1; k <= i; ++k) cnt[i] = cnt[i] + cnt[k - 1] * cnt[i - k]
代码实现如下:
代码实现
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if(amount < 0) return -1;
int cnt[10000];
for(int i = 0;i<10000;i++) cnt[i] = 65535;
cnt[0] = 0;
for(int i=1; i<=amount; ++i) {
for(int j=0; j<coins.size(); ++j) {
if(i>=coins[j]) {
cnt[i] = min(cnt[i], cnt[i-coins[j]] + 1);
}
}
}
if(cnt[amount]!=65535) return cnt[amount];
else return -1;
}
};
复杂度分析
该算法的复杂度应该是O(n^2)的。