LeetCode-343 Integer Break整數拆分乘積最大
阿新 • • 發佈:2018-12-24
作為一道程式設計題,這道題還是很簡單的。簡單的觀察就能知道拆出足夠多的 3 就能使得乘積最大。
int integerBreak(int n)
{
if(n == 2) return 1;
if(n == 3) return 2;
int ret = 1;
while( n>4 )
{
ret *= 3;
n -= 3;
}
return ret * n;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
這道題的難點其實在於證明為什麼拆出足夠多的 33 就能使得乘積最大。下面我就試著證明一下。
首先證明拆出的因子大於 4 是不行的。設 x x 是一個因子,x>4x>4,那麼可以將這個因子再拆成兩個因子 x−2x−2 和 22,易證 (x−2)×2>x(x−2)×2>x。所以不能有大於 4 的因子。
44 這個因子也是可有可無的,4=2+24=2+2,4=2×24=2×2。因此 44 這個因子可以用兩個 22 代替。
除非沒有別的因子可用,11 也不能選作因子。一個數 xx 當它大於 3 時,有 (x−2)×2>(x−1)×1(x−2)×2>(x−1)×1。
這樣呢,就只剩下 22 和 33 這兩個因子可以選了。下面再證明 33 比 22 好。
一個數 x=3m+2nx=3m+2n,那麼 f=3m×2n =3m×2x−3m2f=3m×2n=3m×2x−3m2 可以對它取個對數。
其中 ln3−32ln2>0ln3−32ln2>0 所以 ff 是 mm 的增函式,也就是說 mm 越大越好。所以 33 越多越好。
再多說一句,如果拆出的因子不限於整數的話,可以證明e=2.718…e=2.718… 是最佳的選擇。感興趣的可以試著證明一下。