-
var arr = new Array(n + 1).fill(0);建立模型 -
arr[0] = 1;初始化值 -
arr[1] = 1;初始化值 -
arr[i] = arr[i] + arr[j - 1] * arr[i - j];当树的节点为i时,将i-1拆分为两个部分,然后他们不同的部分分别是两种左右子树,有任何一方的不同,于是和另外一种就不同,于是用乘法运算
var numTrees = function (n) {
var arr = new Array(n + 1).fill(0);
arr[0] = 1;
arr[1] = 1;
for (var i = 2; i <= n; i++) {
for (var j = 1; j <= i; j++) {
arr[i] = arr[i] + arr[j - 1] * arr[i - j];
}
}
return arr[n];
};
方法二
var numTrees = function(n) {
var memo = new Array(n + 1).fill(0).map(() => new Array(n + 1).fill(0));
var f = (i, j) => {
if (i > j) return 1;
if (memo[i][j] != 0) return memo[i][j];
var res = 0;
for (var k = i; k <= j; k++) {
var ift = f(i, k - 1);
var jght = f(k + 1, j);
res += ift * jght;
}
memo[i][j] = res;
return res;
};
return f(1, n);
};