LeetCode#96不同的二叉搜索樹 Java

@author: sdubrz
@date: 2020.04.25
題號: 96
題目難度: 中等
考察內容: 動態規劃
原題鏈接 https://leetcode-cn.com/problems/unique-binary-search-trees/
題目的著作權歸領釦網絡所有,商業轉載請聯繫官方授權,非商業轉載請註明出處。
解題代碼轉載請聯繫 lwyz521604#163.com

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

示例:

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

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

通過次數40,278 提交次數61,717

解法

一般來講,這種問題規模逐漸從1漲到 n 的,都會有一個遞推關係,這種問題就可以考慮用動態規劃的方法來解決。

對於以 1…n 爲節點組成的二叉搜索樹,可以根據其根節點進行一下分類。 1…n 都有可能爲根節點,所以根節點總共有 n 種可能。假設以 x 爲根節點,則左子樹有 x-1 個節點,右子樹有 n-x 個節點。左子樹和右子樹分別有多少種可能,又是一個遞歸的問題。所以以 x 爲根節點時,總共有 f(x1)+f(nx)f(x-1)+f(n-x) 種可能的二叉搜索樹。將所有根節點的情況加起來就是整個問題的解了。下面是 Java 程序的實現。

class Solution {
    public int numTrees(int n) {
        if(n<2){
            return 1;
        }

        int[] count = new int[n+1];
        count[0] = 1;
        count[1] = 1;
        for(int i=2; i<=n; i++){
            int sum = 0;
            for(int root=1; root<=i; root++){
                sum = sum + count[root-1]*count[i-root];
            }
            count[i] = sum;
        }

        return count[n];
    }
}

在 LeetCode 系統中提交的結果:

執行結果: 通過 顯示詳情
執行用時 : 0 ms, 在所有 Java 提交中擊敗了 100.00% 的用戶
內存消耗 : 36.2 MB, 在所有 Java 提交中擊敗了 7.69% 的用戶

本文是在 LeetCode 刷題的筆記,如有不足之處,歡迎通過留言或QQ賜教。

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