zoukankan      html  css  js  c++  java
  • LeetCode | Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n?

    For example, Given n = 3, there are a total of 5 unique BST's.

       1         3     3      2      1
               /     /      /       
         3     2     1      1   3      2
        /     /                        
       2     1         2                 3
    //要求是binary search tree,故要满足左<中<右的有序状态,即中序遍历有序
    //难点在找状态的递推关系,思路:取i作为root,那么要保证root节点有序,root.left就只能用[1,i-1]来构造,root.right就只能用[i+1,n]来构造,则对i来说总的可能数量就是num_left * num_right = states[i-1]*states[n-(i+1)+1]。而在[1,n]中每个数都可以作为root来尝试构造,故要求从1到n的累计和。
    //递推公式:states[1]=1, dp[i] = sum{ dp[0]*dp[i-1], dp[1]*dp[i-2], dp[2]*dp[i-3],..., dp[i-1]*dp[0] }
    public class Solution {
        public int numTrees(int n) {
            if(n == 0) return 1;
            if(n == 1) return 1;
            
            //状态变量数组,states[i]代表n=i时具有的BST个数
            int[] states = new int[n+1];   //包含n=0,共n+1项
            states[0] = 1;
            states[1] = 1;
            
            //状态转移公式:(卡塔兰数的递推关系)
            //dp[i] = sum{ dp[0]*dp[i-1], dp[1]*dp[i-2], dp[2]*dp[i-3],..., dp[i-1]*dp[0] }
            for(int i=2; i<=n; i++){
                int sum = 0;
                for(int j=0; j<i; j++){
                    int temp = states[j] * states[i-1-j];
                    sum += temp;
                }
                states[i] = sum;
            }
            
            return states[n];
        }
    }



  • 相关阅读:
    Slimer软工课设日报-2016年6月30日
    Slimer软工课设日报-2016年6月29日
    软件工程个人总结
    什么是Bug
    构建之法读后感----第1章 绪论
    7.4
    7.1-7.3
    6.29
    软件工程课设 第二天
    软工总结 作业
  • 原文地址:https://www.cnblogs.com/dosmile/p/6444450.html
Copyright © 2011-2022 走看看