代码随想录算法训练营Day 41|343. 整数拆分、96. 不同的二叉搜索树

78 阅读1分钟

343. 整数拆分

题目链接

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

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

思路

dp[i]表示i能拆分的最大乘积,i能拆分成j(i-j),或者j * dp[i-j] 递推公式为 dp[i] = max(dp[i], j * (i-j), j * dp[i-j]) 初始化dp[0]=dp[1]=0 dp[2]=1

var integerBreak = function(n) {
    let dp = new Array(n+1).fill(0)
    dp[0] = 0, dp[1] = 0, dp[2] = 1
    for(let i=3; i<=n; i++){
        for(let j=1; j<i; j++){
            dp[i] = Math.max(dp[i], j*(i-j), j*dp[i-j])
        }
    }
    return dp[n]
};

96. 不同的二叉搜索树

题目链接

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

思路

头节点1 + 头节点2 + 头节点3

  • 头节点1 = 左子树0节点 * 右子树2节点
  • 头节点2 = 左子树1节点 * 右子树1节点
  • 头节点3 = 左子树2节点 * 右子树0节点

dp[0] = 1

递推公式 dp[i] += dp[j-1] * dp[i-j]

var numTrees = function(n) {
    let dp = new Array(n+1).fill(0)
    dp[0] = 1
    for(let i=1; i<=n; i++){
        for(let j=1; j<=i; j++){
            dp[i] += dp[j-1]*dp[i-j]
        }
    }
    return dp[n]
};