动态规划 || 不同的二叉搜索树

思路

n个节点中每个节点都可能当成根节点,除了根节点以外 有n - 1个节点 其实可以把n - 1分解: n - 1 = (n-1) + (0) (n为根节点)
n - 1 = (n - 2) + (1) (n-1为根节点)
....
n - 1 = (1) + (n - 2) (2为根节点)
n - 1 = (0) + (n - 1) (1为根节点)
左边代表左子树,右边代表右子树

解题过程

首先,创建dp数组 dp[n]含义: n个结点的二叉搜索树有几种形态;
其次,初始化dp数组, 如果空节点,那肯定一种情况,即 dp[0] = 0; 如果有一个节点,也是有一种情况 即dp[1] = 1; 如果两个节点可以由上述 dp[0] 和 dp[1] 推出,2个节点中的每一个节点都可以当成根节点,一共需要n次循环,因为除了根节点, 分别对应左孩子有 0 、1 个,而左孩子有0个、1个可以由dp[0]、dp[1]
int numTrees(int n) {
    int* dp = (int*)malloc(sizeof(int)*(n+1));
    if( n < 2){
        return 1;
    }
    for(int i = 0; i <= n; ++i)
        dp[i] = 0;

    dp[0] = 1;
    dp[1] = 1;
    dp[2] = 2;
    
    for(int i = 3; i <= n; i++){
        for(int j = 1; j <= i; j ++ ){
            dp[i] += dp[j - 1] * dp[i -j];
        }
    }
    return dp[n];
}

作者:睡个好觉
链接:https://leetcode.cn/problems/unique-binary-search-trees/solutions/3625701/dong-tai-gui-hua-by-charming-hofstadtern-kd70/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复杂度

  • 时间复杂度: O(n^2)
  • 空间复杂度: O(1)
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    睡个好觉(努力提升自己版)

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值