[LeetCode] 96. Unique Binary Search Trees
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
.
Example 1:
Input: n = 3 Output: 5
Example 2:
Input: n = 1 Output: 1
Constraints:
1 <= n <= 19
不同的二叉搜索树。
题意是给一个数字 n,代表有 n 个 node。问这 n 个节点能组成多少个独一无二的二叉搜索树。
思路是动态规划。设 dp[n] 是最后能用 n 个 node 组成的 BST 的数量/情况。其中 base case 是 dp[0] = 1,i 代表可用的节点个数,j 代表左子树上可用的节点个数,所以 j 的范围才是 [0, i),因为需要留一个节点当做根节点。当有 n 个 node 的时候,需要先选定一个 node 作为根节点,然后需要算出以这个 node 为根节点的情况下,左子树可以有几种情况和右子树可以有几种情况。
时间O(n)
空间O(n)
Java实现
1 class Solution { 2 public int numTrees(int n) { 3 int[] res = new int[n + 1]; 4 res[0] = 1; 5 for (int i = 1; i <= n; i++) { 6 for (int j = 0; j < i; j++) { 7 res[i] += res[j] * res[i - 1 - j]; 8 } 9 } 10 return res[n]; 11 } 12 }
JavaScript实现
1 /** 2 * @param {number} n 3 * @return {number} 4 */ 5 var numTrees = function (n) { 6 var res = new Array(n + 1).fill(0); 7 res[0] = 1; 8 for (var i = 1; i <= n; i++) { 9 for (var j = 0; j < i; j++) { 10 // j代表左子树有几种情况,i - j - 1代表右子树有几种情况 11 res[i] += res[j] * res[i - j - 1]; 12 } 13 } 14 return res[n]; 15 };
还有一个非常好的discussion。