1. 程式人生 > >Unique Binary Search Trees -- LeetCode

Unique Binary Search Trees -- LeetCode

熟悉卡特蘭數的朋友可能已經發現了,這正是卡特蘭數的一種定義方式,是一個典型的動態規劃的定義方式(根據其實條件和遞推式求解結果)。所以思路也很明確了,維護量res[i]表示含有i個結點的二叉查詢樹的數量。根據上述遞推式依次求出1到n的的結果即可。時間上每次求解i個結點的二叉查詢樹數量的需要一個i步的迴圈,總體要求n次,所以總時間複雜度是O(1+2+...+n)=O(n^2)。空間上需要一個數組來維護,並且需要前i個的所有資訊,所以是O(n)。程式碼如下:
public int numTrees(int n) {    if(n<=0)        return 0;    int[] res = new
int[n+1];    res[0] = 1;    res[1] = 1;    for(int i=2;i<=n;i++)    {        for(int j=0;j<i;j++)        {            res[i] += res[j]*res[i-j-1];        }    }    return res[n];}
這種求數量的題目一般都容易想到用動態規劃的解法,這道題的模型正好是卡特蘭數的定義。當然這道題還可以用卡特蘭數的通項公式來求解,這樣時間複雜度就可以降低到O(n)。因為比較直接,這裡就不列舉程式碼了。如果是求解所有滿足要求的二叉樹(而不僅僅是數量)那麼時間複雜度是就取決於結果的數量了,不再是一個多項式的解法了,有興趣的朋友可以看看
Unique Binary Search Trees II