150、【动态规划】leetcode ——96. 不同的二叉搜索树(C++版本)
2023-09-11 14:20:01 时间
题目描述
原题链接:96. 不同的二叉搜索树
解题思路
动态规划五部曲:
(1)dp[i]的含义: 从1到i为节点,可以组成BST的数量
(2)递推公式: dp[i] += dp[j - 1] * dp[i - j],根据已有的数学结论,当以数字i为根节点时,左子树会有以j - 1为头结点的BST个数,右子树会有i - j为头结点的BST个数,此时的共有的情况就是左子树个数 * 右子树个数,左子树从0到i - 1依次遍历,求和得到总情况个数。
(3)dp数组初始化: dp[0] = dp[1] = 1,以1为根节点和以0为根节点(空树)的BST仅有一种情况。
(4)遍历顺序: 从小到大。
(5)举例:
class Solution {
public:
int numTrees(int n) {
int dp[20] = {0};
dp[0] = dp[1] = 1;
for(int i = 2; i <= n; i++) { // 注意这里初始化dp到1即可,不能直接初始化dp[2],因为遍历的时候可能n只有一个1
for(int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
};
参考文章:96. 不同的二叉搜索树、不同的二叉搜索树
相关文章
- C++第一遍宏观把握
- C++ code:位操作实例(bit operation example)
- LeetCode-899. 有序队列【数学,c++】
- 已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“:
- C++设计模式:前端控制器模式
- C++QT开发——布局管理器
- 解答私信@被c++折磨头秃的花季美少女 //C++ 利用指针数组输入10个单词,编写函数对10个单词进行排序并输出,要求判断是否有相同的单词,如果有相同的单词在输出时该单词只输出一次。
- 解答私信@被c++折磨头秃的花季美少女 //C++ 编写一个进阶版的进制转换程序,运行功能如下:请选择要输入的数字的进制(2、8、10、16):请输入该数字:请选择要转换成的进制(2、8。。。
- 解答私信@被c++折磨头秃的花季美少女 //C++ 写一个带命令行参数的程序,可以实现将参数求和、求平均值以及排序之后输出(参数的数量不确定)。
- Leetcode 搜索旋转排序数组(执行用时: 0 ms , 在所有 C++ 提交中击败了 100.00% 的用户)
- C++ windows客户端支持SSL双向认证
- C++学习笔记(十二):重载函数
- VC++ 读写注冊表,注冊文件图标关联
- AI模型C++部署:ubuntu安装Cython并使用C/C++调用python动态库【附加c++与python互相调用算法demo程序接口的源码】
- 详解c++[指针的指针] 和 [指针的引用](五十五)
- Visual Studio Code C++扩展7月更新汇总
- 【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色