96. 不同的二叉搜索树

✅做题思路or感想

这道题是我二刷代码随想录一路无双下来第一个遇到的一点思路也没有的题目,惭愧

dp数组的含义

  • dp[i]是指总节点数为n的不同二叉搜索树的种类

递推公式

  • 在对dp[i]的遍历中,总节点数为n,取其中的j 为一个根节点,则这个节点的左边有j - 1个节点,右边有i - j个节点,故dp[j] = dp[j - 1] * dp[i - j]。而j仅仅是[1, i]中的一个节点给dp[i]带来的二叉搜索树的种类数,还要把其余的节点的种类数都加起来才是dp[i]
  • 综上,有dp[i] += dp[j - 1] * dp[i - j]

初始化

  • 这里的初始化很奇妙,为了能让后面的数成立且有效,所以dp[0] = 1,而dp[0]本身是没有什么意义的,仅仅是因为这样能推出后面的答案而已(难点)

遍历顺序

  • 因为从递推公式知道,后来的值是由前面的值推出,故从小到大
class Solution {
public:
    int numTrees(int n) {
        int dp[21] = {0};
        //初始化
        dp[0] = 1;
        //要俩层的循环
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= i; ++j) {
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        return dp[n];
    }
};
posted @   北原春希  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示