首页IT科技整数拆分原则(LeetCode-343. 整数拆分 – 题解分析)

整数拆分原则(LeetCode-343. 整数拆分 – 题解分析)

时间2025-08-05 10:24:11分类IT科技浏览4393
导读:题目来源 343. 整数拆分...

题目来源

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[i]就表示i拆分后可以得到的最大乘积          。对于dp[i]的状态转移来说            ,需要考虑以下两种情况:

i可以拆分为j和i-j                   ,i-j无需再次拆分          ,此时的乘积为:j * (i - j) i可以拆分为j和i-j        ,将i-j再次拆分                    ,此时的乘积为:j * dp[i - j]

为了求得最大乘积             ,需要从1开始遍历上述的j    ,在遍历的过程中不断更新dp[i]为最大值        。

结果只需要返回dp[n]即可                     ,也就是将n进行拆分后的最优结果                    。

java实现

class Solution { public int integerBreak(int n) { // dp[i] = max(j * (i - j), j * dp[i-j]) int[] dp = new int[n + 1]; dp[0] = 0; dp[1] = 0;// 不可再分 for (int i=2; i<=n; i++) { dp[i] = 0; for (int j = 1; j<i; j++) { dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i-j])); } } return dp[n]; } }

参考

官方题解-整数拆分

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
百度输入法怎么删除词条(百度输入法怎么自定义创建词库_词库同步设置方法)