zoukankan      html  css  js  c++  java
  • LeetCode 96 不同的二叉搜索树I

    Leetcode 96 不同的二叉搜索树

    /**动态规划
     * 状态定义: 
     *       DP[n]表示1~n个节点构成的二叉搜索树总数, 等于以i (1<=i<=n)为根节点的二叉搜索树数量之和
     * 状态递推:  
     *       根节点i左侧由 i-1 个节点构成,数量为 DP[i-1]; 右侧由 n-i 个节点构成,数量为DP[n-i]
     *       因此以i为根节点的二叉搜索树总数为 DP[i-1]*DP[n-i]
     *       即 DP[n] = DP[0]*DP[n-1] + ... + DP[n-1]*DP[n]
     * 初始状态: 
     *       DP[0] = 1(空树); DP[1] = 1(一个根节点); DP[2] = DP[0]*DP[1] + DP[1]*DP[0]; ...
     * */
    class Solution {
        public int numTrees(int n) {
            
            //状态定义及初始状态
            int[] dp = new int[n+1];
            dp[0] = 1;    
            dp[1] = 1;
    
            //状态递推
            //dp[n] = dp[0]*dp[n-1] + dp[1]*dp[n-2] + ... + dp[n-2]*dp[1] + dp[n-1]*dp[0]
            //dp[n-1] -> dp[n]
            for(int end=2; end<=n; end++){
                for(int root=1; root<=end; root++){
                    dp[end] += dp[root-1]*dp[end-root];
                }
            }
    
            //返回值  
            return dp[n];
        }
    }
    
  • 相关阅读:
    策略模式
    模板方法模式

    kafka
    Linux下部署MongoDB
    Linux下安装ssdb
    ssdb常用知识点
    Eclipse 的 Java Web 项目环境搭建
    PLSQL连接Oracle
    redis书籍
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13353042.html
Copyright © 2011-2022 走看看