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)。
解法二: dp
令dp
为n对应的最大积。
那么递推方程就是:dp
=max(i*dp[n-i],i*(n-i))(其中i从1到n-1)。
边界:dp[2]=1;
题目:整数拆分。
解法一 思路:拆成尽量多的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 ; } };
相关文章推荐
- [LeetCode343]Integer Break
- 343. Integer Break
- LeetCode[343] Integer Break
- 343. Integer Break
- 343. Integer Break
- 343. Integer Break
- 343. Integer Break
- 343. Integer Break 等
- 343. Integer Break #Medium
- 343. Integer Break
- LeetCode 343 Integer Break (数学)
- 343. Integer Break
- [Leetcode] #343 Integer Break (DP)
- 343. Integer Break
- 343. Integer Break
- leetcode@ [343] Integer Break (Math & Dynamic Programming)
- 343. Integer Break
- leetcode343 Integer Break java
- 343. Integer Break
- 343. Integer Break