96-Unique Binary Search Trees 二叉搜尋樹的數量

金字塔下的蜗牛發表於2024-05-22

問題描述

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

Given an integer n, return the number of structurally unique BST's (binary search trees) which has exactly n nodes of unique values from 1 to n.

解釋:
給定一個整數n,求1~n,n個整陣列成的二叉搜尋樹的個數

基本思想

構造長度為n+1的動態陣列dp,其中dp[i] 表示 以i為中心的二叉搜尋樹的個數。假設
1~i個數中,

  • 以1為為中心的,其左邊有數0個,右邊有樹i-1個,所以以1為中心,i個數,可以構成二叉搜尋樹 dp[1]* dp[i-1]
  • 以2為中心,其左邊有數1個,右邊有樹i-2個,可以構成二叉搜尋樹為 左邊1個數可以構成的二叉搜尋樹 乘上 右邊 i-2個數可以構成的二叉搜尋樹
  • ....
  • 以i為中心,其左邊有 i-1個數,右邊有1個數,可以構成二叉搜尋樹的個數為 dp[i-1] * dp[1]
    將上面結果依次疊加,即得到1~i個數構成的二叉搜尋樹的數目
    時間複雜度 \(O(n^2)\) 需要計算3+4+....n次乘法

程式碼

C++

    int numTrees(int n) {
        if(n<=1) return 1;
        if (n<=2) return 2;
        vector<int> dp(n+1,0);
        dp[0] = 1;
        dp[1] = 1;
        dp[2] = 2;
        for(int i=3;i<=n;++i) {
            int t = 0;
            for(int j=1;j<=i;++j) {
                t += dp[j-1] * dp[i-j];
            }
            dp[i] = t;
        }
        return dp[n];
    }

python

    def numTrees(self, n: int) -> int:
        if n <=0 : return 0
        if n<=1: return 1
        dp = [0] * (n+1)
        dp[0] = dp[1] = 1
        dp[2] = 2
        for i in range(3, n+1):
            for j in range(1,i+1):
              dp[i] += dp[j-1] * dp[i-j]
        return dp[n] 

相關文章