DDSA Solutions

Number of BST From Array

Time: O(n^3)
Space: O(n^2)
Advertisement

Intuition

Count structurally unique BSTs from given array. Sort array; count depends only on subtree sizes.

Algorithm

  1. 1After sorting, this equals Catalan number C(n) = C(2n,n)/(n+1). Or DP: dp[n] = sum(dp[i]*dp[n-1-i]).

Common Pitfalls

  • Unique BSTs from n distinct values = nth Catalan number. Same as LC 96.
Number of BST From Array.java
Java
// Approach: Catalan number-based DP. dp[i][j] = number of BSTs from arr[i..j] using each element as root.
// Time: O(n^3) Space: O(n^2)
import java.util.*;

class Solution {
    public ArrayList<Integer> countBSTs(int[] arr) {
        ArrayList<Integer> ans = new ArrayList<>();

        for (int x : arr) {
            int less = countLess(arr, x);
            int more = countMore(arr, x);
            ans.add(findCatalan(less) * findCatalan(more));
        }

        return ans;
    }

    private static int mem[] = new int[30];

    private static int findCatalan(int n) {
        if (n <= 1)
            return 1;

        if (mem[n] != 0)
            return mem[n];

        int res = 0;

        for (int i = 0; i < n; i++)
            res += findCatalan(i) * findCatalan(n - i - 1);

        return mem[n] = res;
    }

    private int countLess(int arr[], int x) {
        int c = 0;
        for (int e : arr) {
            if (e < x)
                c++;
        }

        return c;
    }

    private int countMore(int arr[], int x) {
        int c = 0;
        for (int e : arr) {
            if (e > x)
                c++;
        }

        return c;
    }
}
Advertisement
Was this solution helpful?