343. Integer Break

一个比较数学的题目,但是可以用自己的方法做出来。
稍微对这一道题目有点印象就可以了。
自己的方法:dp
class Solution {
public:
int integerBreak(int n) {
if (n < 2)
return 0;
vector<int> dp(n+1, 0);
dp[1] = 1;
dp[2] = 1;
for (int i = 3; i <= n; ++i) {
int maxNum = 0;
for (int j = 1; j <= i-1; ++j)
maxNum = max(maxNum, max(j * (i-j), j * dp[i-j]));
dp[i] = maxNum;
}
return dp[n];
}
};
方法二:
只将每个数划分为2和3.
解释:为什么不能够划分为>= 4的数呢?假设有一个因子为f >= 4,那么可以很容易的将它划分为2和f-2,它们的积为2*f - 4 > f,所以不应该出现大于等于4的。
因为出现1是浪费,所以不应该出现1(除了对2,3本身计算之外)
然后因为3 * 3 比2 * 2 * 2好,所以2不应该出现超过两次。
class Solution {
public:
int integerBreak(int n) {
if (n < 2)
return 0;
if (n == 2)
return 1;
int ret = 1;
while (n > 6) {
ret *= 3;
n -= 3;
}
if (n == 6)
return ret * 3 * 3;
return ret * 2 * (n-2);
}
};
这题其实没什么意思,要是真面试出了这题就用dp,如果非要最优解法,就有点劝退的意思了。
浙公网安备 33010602011771号