Unique Binary Search Trees -- LeetCode
阿新 • • 發佈:2018-12-20
熟悉卡特蘭數的朋友可能已經發現了,這正是卡特蘭數的一種定義方式,是一個典型的動態規劃的定義方式(根據其實條件和遞推式求解結果)。所以思路也很明確了,維護量res[i]表示含有i個結點的二叉查詢樹的數量。根據上述遞推式依次求出1到n的的結果即可。時間上每次求解i個結點的二叉查詢樹數量的需要一個i步的迴圈,總體要求n次,所以總時間複雜度是O(1+2+...+n)=O(n^2)。空間上需要一個數組來維護,並且需要前i個的所有資訊,所以是O(n)。程式碼如下: Unique Binary Search Trees II。
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)。因為比較直接,這裡就不列舉程式碼了。如果是求解所有滿足要求的二叉樹(而不僅僅是數量)那麼時間複雜度是就取決於結果的數量了,不再是一個多項式的解法了,有興趣的朋友可以看看