96. Unique Binary Search Trees

https://leetcode.com/problems/unique-binary-search-trees/#/description

這題是找BST有多少種可能的排列。
很多人提到,這題恰好用到了卡特蘭數(shù)的那個sigma公式。

這個人的解釋蠻清楚的
The essential process is: to build a tree, we need to pick a root node, then we need to know how many possible left sub trees and right sub trees can be held under that node, finally multiply them.

取一個num做root,然后找出左子樹和右子樹分別有多少種可能的樣子,然后相乘;最后相加。

至于為什么是multiply而不是add,是因為每個左邊的子樹跟所有右邊的子樹匹配,而每個右邊的子樹也要跟所有的左邊子樹匹配,總共有左右子樹數(shù)量的乘積種情況。

這題的遞推公式不止跟i-1有關(guān)系,可以寫成:

dp[i] = sigma(dp[k] * dp(i-k-1)) , 0<=k<=i-1

To build a tree contains {1,2,3,4,5}. First we pick 1 as root, for the left sub tree, there are none; for the right sub tree, we need count how many possible trees are there constructed from {2,3,4,5}, apparently it's the same number as {1,2,3,4}. So the total number of trees under "1" picked as root is dp[0] * dp[4] = 14. (assume dp[0] =1). Similarly, root 2 has dp[1]dp[3] = 5 trees. root 3 has dp[2]dp[2] = 4, root 4 has dp[3]dp[1]= 5 and root 5 has dp[0]dp[4] = 14. Finally sum the up and it's done.


code:

    public int numTrees(int n) {
        int dp[] = new int[n + 1];
        //包含0個node的BST有1種
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i < n + 1; i++)
          //這里的j<i不要寫成j<n了
            for (int j = 0; j < i; j++) {
                dp[i] += dp[j] * dp[i - j - 1];
            }
        return dp[n];
    }

ref:
http://www.cnblogs.com/springfor/p/3884009.html
http://fisherlei.blogspot.jp/2013/03/leetcode-unique-binary-search-trees.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,890評論 0 33
  • LeetCode 96 Unique Binary Search Trees Given n, how many ...
    ShuiLocked閱讀 268評論 0 0
  • 給出n個數(shù)字,能夠構(gòu)建出多少個不同的bst。這道題可以用動態(tài)規(guī)劃來做。那么動態(tài)規(guī)劃重要的是找出狀態(tài),以及狀態(tài)轉(zhuǎn)移方...
    單倍體閱讀 974評論 1 0
  • 今天看了林清玄作家的一篇文章,論述了佛教放生的變味以及積極的改變。 佛教通過放生以積功德的做法,延續(xù)已久,人們生病...
    不加蔥的陽春面閱讀 276評論 0 0
  • 深夜幽暗固然有著些可畏懼的地方,我雖然膽子小但也并不害怕那些牛鬼蛇神。并不是我沒有對神明的敬畏,而是自己更想見...
    humennature閱讀 266評論 0 0

友情鏈接更多精彩內(nèi)容