给定一个正整数 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
Related Topics
一般分析
数字n的时候,我们把它分成两份
- 小于n的k
- n-k
这两部分
以k部分固定,想要乘积最大的话,那么 n-k
部分内部的乘积需要最大
那么我们就可以得到这样的分析
整数n的最大分段乘积为 k 乘以 [n-k]部分的最大分段乘积
,从k
从 2 取到 n-1
,所有的情况都遍历一遍之后取最大值。
特殊情况
在执行用例过程中,发现一点特殊情况
- 如果被分割出的一部分为2的话,应当直接取2, 显然 2比 1*1 更大,不是么
- 当n=6的时候,按照之前的逻辑,因为
dp[4] = 4
,所以2 * dp[4] = 8
,这是得到的最大值,但是显然最大值应该是3 * 3 = 9
, 那么就存在一种情况下n/2
的平方才是最大值。
class Solution {
public int integerBreak(int n) {
if (n<=2){
return 1;
}
int[] dp = new int[n+1];
dp[1] = 1;
dp[2] = 2;
int i = 2;
while (++i <= n){
int j = 1;
dp[i] = i * i / 4;
while (++j <= i-1){
dp[i] = Math.max(dp[i],j*dp[i-j]);
}
}
return dp[n];
}
}
发表评论