整数拆分
-
给定一个正整数
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
-
暴力递归
class Solution {
public:
int integerBreak(int n) {
return intbreak(n);
}
int intbreak(int n) {
if(n == 2) return 1;
if(n == 3) return 2;
if(n == 4) return 4;
int max = 0;
for(int i = 2;i < n/2 + 1; ++i) {
int x = i > intbreak(i) ? i : intbreak(i);
int y = (n-i) > intbreak(n-i) ? (n-i) : intbreak(n-i);
max = x*y > max ? x*y : max;
}
return max;
}
};
- 超时,记忆化搜索
class Solution {
public:
vector<int> dp;
int integerBreak(int n) {
dp.resize(n+1,-1);
return intbreak(n);
}
int intbreak(int n) {
if(dp[n] != -1) return dp[n];
if(n == 2) return dp[n] = 1;
if(n == 3) return dp[n] = 2;
if(n == 4) return dp[n] = 4;
int max = 0;
for(int i = 2;i < n/2 + 1; ++i) {
int x = i > intbreak(i) ? i : intbreak(i);
int y = (n-i) > intbreak(n-i) ? (n-i) : intbreak(n-i);
max = x*y > max ? x*y : max;
}
return dp[n] = max;
}
};