leetcode 343. 整数拆分
题目详情
题目链接
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
- 示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。- 示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。
我的代码
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n + 1, 0);
if (n == 1) {
return 1;
}
dp[1] = 1;
if (n == 2) {
return 1;
}
dp[2] = 1;
if (n == 3) {
return 2;
}
dp[3] = 2;
for (int i = 4; i <= n; ++i) {
int result = 0;
for (int start = 1; start <= i / 2; ++start) {
result = max(max(dp[start], start) * max(dp[i - start], i - start), result);
}
dp[i] = result;
}
return dp[n];
}
};
我的成绩
执行结果:通过
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6.4 MB, 在所有 C++ 提交中击败了10.53%的用户
一些想法
本道题使用的动态规划。
执行用时为 0 ms 的范例
class Solution {
public:
int integerBreak(int n) {
if (n <= 3) return n - 1;
int x = n / 3, y = n % 3;
//恰好整除,直接为3^x
if (y == 0) return (int) pow(3, x);
//余数为1,退一步 3^(x-1)*2*2
if (y == 1) return (int) pow(3, x - 1) * 4;
//余数为2,直接乘以2
return (int) pow(3, x) * 2;
}
};
思考
参见官方解答