题目:
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
class Solution {
// public:
// /*************************法一::动态规划***********************************/
// // 时间复杂度:O(n^2) 空间复杂度:O(n)
// int integerBreak(int n)
// {
// // 1、确定 dp 数组以及下标的含义
// // dp[i] 分拆数字 i,可以得到的最大乘积为 dp[i]
// // 2、确定递归公式,取 0-i 的一个中间值 j,j 从 1 开始遍历,到 n-1
// // dp[i] = max(dp[i], max(i * (j - i), j * dp[i - j]))
// // 3、dp 的初始化
// // dp[0]=1 dp[1]=1 可能这么初始化有点牵强
// // dp[2]=1 这个初始化,才是有意义的。
// // 4、确定遍历顺序
// vector<int> dp(n + 1);
// dp[2] = 1; // 下标 0 、 1 对应的元素忽略不计,所以 dp 数组得个数为 n+1
// for(int i = 3; i <= n; i++)
// {
// for(int j = 1; j < i - 1; j++)
// {
// dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
// }
// }
// return dp[n];
// }
public:
/*************************法二::贪心算法***********************************/
// 时间复杂度:O(n) 空间复杂度:O(1)
//首先这道题有点考数学知识的意思,算术几何均值不等式,取等的条件就是将其等分,经推导以3为取值最好。
int integerBreak(int n)
{
// 情况一:n 本身是 小于等于 4 的数,那么就分情况来处理
if(n == 2) return 1;
if(n == 3) return 2;
if(n == 4) return 4;
// 情况二:n 大于 4 那么就将结果 乘一次 3 ,并把 n 减去一个3
// 最后余下的结果(也就是最终的余数)可能为 1,2,3,4 这四种情况,
// 将最后的余数 与 result相乘,即为最终结果。
int result = 1;
while(n > 4)
{
result *= 3;
n -= 3;
}
result *= n;
return result;
}
};