刻意練習:LeetCode實戰 -- 不同的二叉搜索樹

背景

今天,第二期基礎算法(Leetcode)刻意練習訓練營 的打卡任務是“不同的二叉搜索樹 II”,而LeetCode也有“不同的二叉搜索樹”題目,故一起寫了。


題目

  • 題號:96
  • 難度:中等
  • https://leetcode-cn.com/problems/unique-binary-search-trees/

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

示例:

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

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

實現

第一種:動態規劃

G(n)表示n個節點二叉排序樹的個數,f(i)表示以i作爲根節點的二叉排序樹的個數。

因此有:G(n) = f(1) + f(2) + f(3) + ... + f(n)

i爲根節點的左子樹有i-1個節點,因此左子樹有G(i-1)種二叉排序樹

右子樹有n-i個節點,因此右子樹有G(n-i)種二叉排序樹

從而得到:f(i) = G(i-1)*G(n-i)

最後得到:G(n) = G(0)*G(n-1) + G(1)*G(n-2) + G(2)G(n-3) + ... + G(n-1)*G(0)

G(0) = 1
G(1) = 1
G(2) = G(0)*G(1) + G(1)*G(0)
G(3) = G(0)*G(2) + G(1)*G(1) + G(2)*G(0)
......
  • 執行結果:通過
  • 執行用時:48 ms, 在所有 C# 提交中擊敗了 66.10% 的用戶
  • 內存消耗:14.6 MB, 在所有 C# 提交中擊敗了 16.67% 的用戶
public class Solution
{
    public int NumTrees(int n)
    {
        if (n == 0 || n == 1)
            return 1;

        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= n; i++)
        {
            for (int j = 0; j < i; j++)
                dp[i] += dp[j] * dp[i - j - 1];
        }
        return dp[n];
    }
}

往期活動

LSGO軟件技術團隊會定期開展提升編程技能的刻意練習活動,希望大家能夠參與進來一起刻意練習,一起學習進步!


我是 終身學習者“老馬”,一個長期踐行“結伴式學習”理念的 中年大叔

我崇尚分享,渴望成長,於2010年創立了“LSGO軟件技術團隊”,並加入了國內著名的開源組織“Datawhale”,也是“Dre@mtech”、“智能機器人研究中心”和“大數據與哲學社會科學實驗室”的一員。

願我們一起學習,一起進步,相互陪伴,共同成長。

後臺回覆「搜搜搜」,隨機獲取電子資源!
歡迎關注,請掃描二維碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章