343. 整数拆分

动态规划

解题思路

  1. 确定 dp 数组以及下标的含义dp[i] 的含义为 分拆数字 i 可得到的最大乘积 dp[i]

  2. 确定递推公式:状态转移方程 dp[i] = max(dp[i], (i - j) * j, dp[i - j] * j)

    • j * (i - j) 是单纯的把整数拆分为两个数相乘;
    • j * dp[i - j] 是拆分成两个以及两个以上的个数相乘;
    • dp[i] 是每次计算 dp[i] 取最大值;
  3. 如何初始化 dp 数组dp[2] = 1

    • 严格从 dp[i] 的定义来说,dp[0]dp[1] 就不应该初始化,也就是没有意义的数值;
    • 这里只初始化 dp[2] ,从 dp[i] 的定义来说,拆分数字 2 得到的最大乘积是 1
  4. 确定遍历顺序dp[i] 是依靠 dp[i - j] 的状态,所以遍历 i 一定是从前向后遍历;

  5. 举例推导 dp 数组

    索引 i 2 3 4 5 6 7 8 9 10
    分拆数字 i 可得到的最大乘积 dp[i] 1 2 4 6 9 12 18 27 36

复杂度

  1. 时间复杂度:O(n^2)

  2. 空间复杂度:O(n)

代码实现

var integerBreak = function (n) {
    // 1.声明 dp 数组
    let dp = new Array(n + 1).fill(0);

    // 2. 初始化 dp 数组
    dp[2] = 1;

    // 3. 根据递推公式,更新矩阵 dp[i] 的值
    for (let i = 3; i <= n; i++) {
        for (let j = 1; j <= i / 2; j++) {
            dp[i] = Math.max(dp[i], dp[i - j] * j, (i - j) * j);
        }
    }
    return dp[n];
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 动态规划
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现