[Leetcode] Unique Binary Search Trees 惟一二叉搜索樹

Unique Binary Search Trees

I && II 解法請見:https://yanjia.li/zh/2019/02/...

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.code

1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

動態規劃

複雜度

時間 O(N!) 空間 O(N)leetcode

思路

二叉搜索樹有個性質,就是左邊的數都比根小,右邊的數都比根大。另外,題目說明二叉樹的節點是從1到n,因此咱們能肯定若是根爲k,則根左邊的數是1到k-1,根右邊的數是k+1到n。還有一點技巧是,對於經過一個根來講,惟一二叉樹的數量是其左子樹的數量乘以右子樹的數量,這是簡單的乘法原理。而且,左右子樹的形態數量是跟具體的數無關的,只跟這個樹裏有多少節點有關。而根能夠選擇從1到n的任意的數,惟一二叉樹的總數,就是根爲1到n的樹相加。因此該問題化簡爲以k爲根,其惟一左子樹和右子樹各有多少,這就是個動態規劃的問題了。咱們創建一個數組dp[i],表明節點數爲i的惟一子樹有多少個。顯然dp[0]=dp[1]=1get

代碼

public class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        dp[0] = dp[1] = 1;
        //從節點數2開始計算到節點數爲n的BST
        for(int i = 2; i < n + 1; i++){
            //計算根是第一個數的BST數量,直到根是最後一個數的BST數量,這裏j能夠理解爲根左邊的節點數
            for(int j = 0; j < i; j++){
                //有n的節點的BST一共有 G(n)=F(1,n-1)+F(2,n-1)+...+F(n-1,n-1)個
                //以i爲根總共n個節點的BST有 F(i,n)=G(i-1)*G(i+1->n)個
                //BST形態數量之和一共有多少個節點有關 G(i+1->n)=G(n-i)
                //因此G(n)= G(0)*G(n-1)+G(1)*G(n-2)+...
                dp[i] += dp[j] * dp[i - j - 1];
            }
        }
        return dp[n];
    }
}
相關文章
相關標籤/搜索