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];
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端