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

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

时间2025-06-20 22:47:11分类IT科技浏览4020
导读:题目来源 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
织梦系统(织梦CMS免费版的优势与特性分析)