算法刷题|343.整数拆分、96.不同的二叉搜索树

整数拆分

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

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

  • dp[i]的含义:整数i拆分之后,所有数乘积的最大值是dp[i]
  • 递推公式:
    • 情况一:拆分成两个数,dp[i] = j * (i-j)
    • 情况二:拆分成3个或3个数以上,dp[i] = j * dp[i-j]
  • 初始化:dp[0]和dp[1]都不能拆分,不用管,dp[2] = 1
  • 遍历顺序:从前往后
  • 打印dp数组:debug使用
class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n+1];
        dp[2] = 1;
        for(int i = 3;i<=n;i++){
            for(int j = 1;j<=i/2;j++){// 为什么是i/2因为一个数拆成m个大小相近的数乘积才是最大的,所有i=6的时候,拆分1*5 2*4 都没有3*3大,所有取一半的就行了
                // 因为dp[i]在内层循环多次赋值,所以需要在下面取最大值的时候包括自己
                dp[i] = Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j]));
            }
        }
        return dp[n];
    }
}

不同的二叉搜索树

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

  • dp[i]的含义:由i个节点可以组成dp[i]个不同的二叉搜索树
  • 递推公式:dp[i] += dp[j-1] * dp[i-j],j表示使用j作为头节点,例如i=3,等于1作为头节点的组合数+2作为头节点的组合数+3作为头节点的组合数;所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]
  • dp数组初始化:dp[0] =1
  • 遍历顺序:从前往后
  • 打印dp数组:debug使用
class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n+1];
        dp[0] = 1;
        for(int i = 1;i<=n;i++){
            // 以j为头节点的所有组合数 加起来就是当前i的组合数
            for(int j = 1;j<=i;j++){
                dp[i] += dp[j-1]*dp[i-j];
            }
        }
        return dp[n];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值