一.数学推理法 (贪心)
为了使几个数相加的和的乘积最大,应将这些数拆分成尽量多的3,如果不能全都是三,就拆出一两个2。
这个结论是基于对数字拆分问题的分析,其中关键在于如何有效地分配数字以最大化乘积。当我们将一个数拆分成若干个数之和时,如果限制必须拆成两个数,那么最理想的情况是这两个数尽可能接近,例如10可以拆成5和5,这样5乘以5得到的结果最大。然而,如果拆分的数量不受限制,那么拆分成尽量多的3是最优策略。这是因为3的乘积在所有数字相加的情况下是最大的。如果无法确保所有数都是3,那么拆出一个或两个2来配合3,可以进一步增加乘积。例如,6可以拆成3和3,7可以拆成3和2和2(如果允许的话),这样拆分后的乘积会比其他拆分方式更大。
所以哈哈哈!这个其实也是贪心的思想,去拆分更多的3.
class Solution {
public:
int integerBreak(int n) {
//根据数学推理来算的话
if(n < 3) return 1;
if(n == 3) return 2;
int k = n%3;//k是余数
int m = n/3; //m是3的个数
int result = 0;
if(k == 1)
{
result = pow(3,m-1)*4;
}
if(k == 2)
{
result = pow(3,m)*k;
}
if(k == 0)
{
result = pow(3,m)*1;
}
return result;
}
};
时间复杂度为:O(N)
空间复杂度:O(1)
二.动态规划
还是要回归普遍思路哎 (这是官方题解的动态规划)
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n + 1);
dp[2] = 1;
for (int i = 3; i <= n ; i++) {
for (int j = 1; j <= i / 2; j++) {
dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
}
}
return dp[n];
}
};
时间复杂度O(N^2)
空间复杂度O(N)