1. 程式人生 > >Leetcode No.96

Leetcode No.96

red 分享 輸出 ima sub for mtr cti 遞推

給定一個整數 n,求以 1 ... n 為節點組成的二叉搜索樹有多少種?

示例:

輸入: 3
輸出: 5
解釋:
給定 n = 3, 一共有 5 種不同結構的二叉搜索樹:

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

解答:
本題確切的含義是:用 n 個節點可以構成多少個二叉搜索樹(題目描述存在問題)。那麽用卡塔蘭數列(也稱明安圖數列)可以直接解決這個問題。

下面內容摘自wiki百科:

形式為:技術分享圖片

遞推式為:技術分享圖片

也滿足技術分享圖片

應用可以有以下四種情況:

  • Cn表示長度2n的dyck word的個數。Dyck word是一個有n個X和n個Y組成的字串,且所有的前綴字串皆滿足X的個數大於等於Y的個數。以下為長度為6的dyck words:
XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY
  • 將上例的X換成左括號,Y換成右括號,Cn表示所有包含n組括號的合法運算式的個數:
((())) ()(()) ()()() (())() (()())
  • Cn表示有n個節點組成不同構二叉樹的方案數。下圖中,n等於3,圓形表示節點,月牙形表示什麽都沒有。
  • Cn表示有2n+1個節點組成不同構滿二叉樹(full binary tree)的方案數。下圖中,n等於3,圓形表示內部節點,月牙形表示外部節點。本質同上。
技術分享圖片
  • Cn表示所有在n × n格點中不越過對角線的單調路徑的個數。一個單調路徑從格點左下角出發,在格點右上角結束,每一步均為向上或向右。計算這種路徑的個數等價於計算Dyck word的個數:X代表“向右”,Y代表“向上”。下圖為n = 4的情況:
技術分享圖片
  • Cn表示通過連結頂點而將n + 2邊的凸多邊形分成三角形的方法個數。下圖中為n = 4的情況:
技術分享圖片
  • Cn表示用n個長方形填充一個高度為n的階梯狀圖形的方法個數。下圖為n = 4的情況:
技術分享圖片
  • Cn表示n個無標號物品的半序的個數。
本題屬於第四種應用。 需要指出:res需要用long型內存,否則res =res * 2*(2*i+1)/(i+2) 這一步可能會發生溢出(n = 19時)。當然也可以以用累加的遞推式,就不會發生這個問題。
//96  卡塔蘭數列
int numTrees(int n)
{
    if(n<2) return 1;
        long res=1;
        for(int i=1;i<n;i++)
            res =res * 2*(2*i+1)/(i+2);
        return (int)res;
}//96




Leetcode No.96