Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.算法
For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).less
Note: you may assume that n is not less than 2.this
Hint:spa
題意:給一個n(n>=2),求相加等於n且乘積最大的一組整數的積。code
題解:blog
這其實就是一道高中數學題,可是leetcode上的數據比較水,致使徹底不用數學推導的O(n2)的dp也能夠過。leetcode
解法一(純dp):get
令dp[n]爲n對應的最大積。數學
那麼遞推方程就是:dp[n]=max(i*dp[n-i],i*(n-i))(其中i從1到n-1)。it
邊界:dp[2]=1;
時間複雜度:O(n2)
class Solution { public: int integerBreak(int n) { int dp[n]; 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[n]; } };
解法二(當成數學題來作就好):
由均值不等式(n個數的算術平均數大於等於它們的幾何平均數):
>=
得:當把輸入的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越好。那麼2<e<3,並且e=2.71828...,因此取3是最好的,若是取不到3就取2。
冪運算複雜度爲O(lgn),因此這個算法複雜度爲O(lgn)。
class Solution { public: int integerBreak(int n) { if(n == 2) return 1; else if(n == 3) return 2; else if(n%3 == 0) return pow(3, n/3); else if(n%3 == 1) return 2 * 2 * pow(3, (n - 4) / 3); else return 2 * pow(3, n/3); } };