您的位置:首页 > 其它

343. Integer Break

2017-08-24 20:13 351 查看
https://leetcode.com/problems/integer-break/description/

题目:整数拆分。

解法一 思路:拆成尽量多的3。

证明:


>=


得:当把输入的n拆分成几个相等的数时它们的积最大。

那么问题来了,拆分成几个呢?

为了方便使用导数,我们先假设我们可以把n拆分成实数。那么设每一个数为x,则一共有n/x个数。

设它们的积为f(x),则f(x)=x(n/x),那么怎么求f(x)最大值呢?求导数!

f′(x)=(n/x2) * x(n/x) * (1-lnx)

当x=e时取极大值。

而我们题目里规定x为整数,那么我们只需要取的x越靠近e越好。所以取3是最好的,如果取不到3就取2。

幂运算复杂度为O(lgn),所以这个算法复杂度为O(lgn)。

class Solution {
public:
int integerBreak(int n) {
if(n == 2) return 1;
if(n == 3) return 2;
if(n == 4) return 4;
int ret = 1;
while( n>4 )
{
ret *= 3;
n -= 3;
}
return ret * n;
}
};


解法二: dp

令dp
为n对应的最大积。

那么递推方程就是:dp
=max(i*dp[n-i],i*(n-i))(其中i从1到n-1)。

边界:dp[2]=1;

class Solution {
public:
int integerBreak(int n) {
int dp[n+1];
dp[1]=1;
dp[2]=1;
for(int i=3;i<=n;i++){
dp[i]=-1;
for(int j=1;j<i;j++){
dp[i]=max(j*dp[i-j],max(dp[i],j*(i-j)));
}
}
return dp
;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: