[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

LeetCode 题目总结

posted @ 2020-02-10 13:28  CNoodle  阅读(461)  评论(0编辑  收藏  举报