背景
今天,第二期基礎算法(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軟件技術團隊會定期開展提升編程技能的刻意練習活動,希望大家能夠參與進來一起刻意練習,一起學習進步!
- Python基礎刻意練習活動即將開啓,你參加嗎?
- Task01:變量、運算符與數據類型
- Task02:條件與循環
- Task03:列表與元組
- Task04:字符串與序列
- Task05:函數與Lambda表達式
- Task06:字典與集合
- Task07:文件與文件系統
- Task08:異常處理
- Task09:else 與 with 語句
- Task10:類與對象
- Task11:魔法方法
- Task12:模塊
我是 終身學習者“老馬”,一個長期踐行“結伴式學習”理念的 中年大叔。
我崇尚分享,渴望成長,於2010年創立了“LSGO軟件技術團隊”,並加入了國內著名的開源組織“Datawhale”,也是“Dre@mtech”、“智能機器人研究中心”和“大數據與哲學社會科學實驗室”的一員。
願我們一起學習,一起進步,相互陪伴,共同成長。
後臺回覆「搜搜搜」,隨機獲取電子資源!
歡迎關注,請掃描二維碼: