LeetCode 第 343 題 (Integer Break)
LeetCode 第 343 題 (Integer Break)
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).
Note: you may assume that n is not less than 2.
作為一道程式設計題,這道題還是很簡單的。簡單的觀察就能知道拆出足夠多的 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;
}
這道題的難點其實在於證明為什麼拆出足夠多的
3
就能使得乘積最大。下面我就試著證明一下。
首先證明拆出的因子大於 4 是不行的。設
x
是一個因子,x > 4
,那麼可以將這個因子再拆成兩個因子 x - 2
和 2
,易證 (x - 2) \times 2 > x
。所以不能有大於 4 的因子。
4
這個因子也是可有可無的,4 = 2 + 2
,4 = 2 \times 2
。因此 4
這個因子可以用兩個 2
代替。
除非沒有別的因子可用,
1
也不能選作因子。一個數 x
當它大於 3 時,有 (x-2) \times 2 > (x-1) \times 1
。
這樣呢,就只剩下
2
和 3
這兩個因子可以選了。下面再證明 3
比 2
好。
一個數
x = 3 m + 2 n
,那麼 f = 3^m \times 2^n = 3^m \times 2^{\frac{x - 3m}{2}}
可以對它取個對數。
\begin{eqnarray}
ln f &=& m \ln 3 + n \ln 2 \\
&=& m \ln 3 + \frac{x - 3m}{2} \ln 2 \\
&=& \frac{x}{2} \ln 2 + (\ln3 - \frac{3}{2} \ln 2) m
\end{eqnarray}
其中
\ln3 - \frac{3}{2} \ln 2 > 0
所以 f
是 m
的增函式,也就是說 m
越大越好。所以 3
越多越好。
再多說一句,如果拆出的因子不限於整數的話,可以證明
e = 2.718 \ldots
是最佳的選擇。感興趣的可以試著證明一下。 相關文章
- LeetCode 第 7 題(Reverse Integer)LeetCode
- LeetCode-343. 整數拆分 - 題解分析LeetCode
- Leetcode Word BreakLeetCode
- LeetCode - 解題筆記 - 7 - Reverse IntegerLeetCode筆記
- LeetCode - 解題筆記 - 12 - Integer to RomanLeetCode筆記
- Leetcode Integer to RomanLeetCode
- leetcode Reverse IntegerLeetCode
- leetcode Roman to IntegerLeetCode
- [LeetCode] Roman to IntegerLeetCode
- LeetCode-Word BreakLeetCode
- Word Break leetcode javaLeetCodeJava
- Leetcode 12 Integer to RomanLeetCode
- Leetcode 13 Roman to IntegerLeetCode
- Leetcode 7 Reverse IntegerLeetCode
- LeetCode-Integer ReplacementLeetCode
- LeetCode-Integer BreaksLeetCode
- Leetcode-Roman to IntegerLeetCode
- Leetcode-Integer to RomanLeetCode
- Reverse Integer leetcode javaLeetCodeJava
- Integer to Roman leetcode javaLeetCodeJava
- Roman to Integer leetcode javaLeetCodeJava
- LeetCode139:Word BreakLeetCode
- Leetcode-Word Break IILeetCode
- Word Break II leetcode javaLeetCodeJava
- AT_abc343_G [ABC343G] Compress Strings 題解
- Leetcode 273 Integer to English WordsLeetCode
- Leetcode 12. Integer to RomanLeetCode
- Leetcode-Problem:Reverse IntegerLeetCode
- LeetCode-Integer to English WordsLeetCode
- leetcode String to Integer (atoi)LeetCode
- Leetcode - String to Integer (atoi)LeetCode
- Leetcode第1~10題LeetCode
- LeetCode 343. 整數拆分--動態規劃LeetCode動態規劃
- Leetcode 8 String to Integer (atoi)LeetCode
- [Swift LeetCode]13. Roman to IntegerSwiftLeetCode
- String to Integer (atoi) leetcode javaLeetCodeJava
- LeetCode140:Word Break IILeetCode
- 【LeetCode】Word Break 動態規劃LeetCode動態規劃