1. 程式人生 > >LeetCode-343 Integer Break整數拆分乘積最大

LeetCode-343 Integer Break整數拆分乘積最大

作為一道程式設計題,這道題還是很簡單的。簡單的觀察就能知道拆出足夠多的 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,那麼可以將這個因子再拆成兩個因子 x2x−2 和 22,易證 (x2)×2>x(x−2)×2>x。所以不能有大於 4 的因子。

44 這個因子也是可有可無的,4=2+24=2+24=2×24=2×2。因此 44 這個因子可以用兩個 22 代替。

除非沒有別的因子可用,11 也不能選作因子。一個數 xx 當它大於 3 時,有 (x2)×2>(x1)×1(x−2)×2>(x−1)×1

這樣呢,就只剩下 22 和 33 這兩個因子可以選了。下面再證明 33 比 22 好。

一個數 x=3m+2nx=3m+2n,那麼 f=3m×2n

=3m×2x3m2f=3m×2n=3m×2x−3m2 可以對它取個對數。 

lnf===mln3+nln2mln3+x3m2ln2x2ln2+(ln332ln2)mlnf=mln⁡3+nln⁡2=mln⁡3+x−3m2ln⁡2=x2ln⁡2+(ln⁡3−32ln⁡2)m

其中 ln332ln2>0ln⁡3−32ln⁡2>0 所以 ff 是 mm 的增函式,也就是說 mm 越大越好。所以 33 越多越好。

再多說一句,如果拆出的因子不限於整數的話,可以證明e=2.718e=2.718… 是最佳的選擇。感興趣的可以試著證明一下。