• LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树


    一、LeetCode343. 整数拆分

    题目链接:343. 整数拆分
    题目描述:

    给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

    返回 你可以获得的最大乘积 。

    示例 1:

    输入: n = 2
    输出: 1
    解释: 2 = 1 + 1, 1 × 1 = 1。

    示例 2:

    输入: n = 10
    输出: 36
    解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

    提示:

    • 2 <= n <= 58
    算法分析:
    定义dp数组及下标含义:

    dp[i]表述正整数i拆分成k个正整数乘积所能够得到的最大值。

    递推公式:

    用一个j来遍历从1到i,得到两个dp[i],即dp[i]=j*(i-j)(将整数i分成两个正整数j和i-j),和dp[i]=j*dp[i-j]。

    所以dp[i] = max(dp[i],max(j*(i-j),j*dp[i-j]))。

    初始化:

    dp[0]和dp[1]初始化没有意义,所以我们初始化dp[2]=1(2拆分成两个1相乘)。

    遍历顺序:

    因为dp[2]已经初始化了,所以我们从3遍历到n。

    代码如下:

    1. class Solution {
    2. public int integerBreak(int n) {
    3. int[] dp = new int[n + 1];
    4. dp[2] = 1;//初始化
    5. for(int i = 3; i <= n; i++) {
    6. for(int j = 1; j < i; j++) {
    7. dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
    8. }
    9. }
    10. return dp[n];
    11. }
    12. }

    时间复杂度o(n^2),空间复杂度o(n)。

    二、LeetCode96. 不同的二叉搜索树

    题目链接:96. 不同的二叉搜索树
    题目描述:

    给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

    示例 1:

    输入:n = 3
    输出:5
    

    示例 2:

    输入:n = 1
    输出:1
    

    提示:

    • 1 <= n <= 19
    算法分析:
    定义dp数组及下标含义:

    dp[i]表示i个节点组成的二叉搜索树的种树。

    递推公式:

    j从1遍历到i,当j为头节点时,左子树有i-1个节点,左子树的种类数相当于dp[j-1],右子树有i-j个节点,右子树的种类数相当于dp[i-j]。

    所以dp[i]+=dp[j-1]*dp[i-j],j从1比那里遍历到i;

    初始化:

    dp[0]初始化为1(0的话会影响乘法结果),dp[1]初始化为1(一个节点的二叉搜索树只有一种情况)

    遍历顺序:

    i从2遍历到n,然后确定dp[i](dp[i]+=dp[j-1]*dp[i-j])。

    如果结果有误打印dp数组检查验证。

    代码如下:

    1. class Solution {
    2. public int numTrees(int n) {
    3. int[] dp = new int[n + 1];
    4. dp[0] = 1;
    5. dp[1] = 1;
    6. for(int i = 2; i <= n; i++){
    7. for(int j = 1; j <= i; j++) {
    8. dp[i] += dp[j - 1] * dp[i - j];
    9. }
    10. }
    11. return dp[n];
    12. }
    13. }

    时间复杂度o(n^2),空间复杂度o(n)

    总结

    这两道题还是比较难的,自己想很难有思路。

  • 相关阅读:
    北理工操作系统实验合集 | API解读与例子(持续更新)
    Django员工管理系统
    Stream流使用——(未完)
    网络工程师和网络运维工程师,有什么区别?
    【无标题】
    JS语言里常见的随机函数示例,实验结果分布规律分析
    Hadoop-MapReduce
    LeetCode 面试题 04.01. 节点间通路
    【Java筑基】IO流基础之常见工具流和进程通信
    DataFunSummit:2023年数据基础架构峰会-核心PPT资料下载
  • 原文地址:https://blog.csdn.net/2201_76107580/article/details/134555078