題目描述
給你一根長度爲 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記爲 k[0],k[1]…k[m-1] 。請問 k[0]k[1]…*k[m-1] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別爲2、3、3的三段,此時得到的最大乘積是18。
示例 1:
輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1
示例 2:
輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
提示:
2 <= n <= 58
切分規則:
最優: 3 。把繩子儘可能切爲多個長度爲 3 的片段,留下的最後一段繩子的長度可能爲 0,1,2 三種情況。
次優: 2 。若最後一段繩子長度爲 2 ;則保留,不再拆爲 1+1 。
最差: 1 。若最後一段繩子長度爲 1 ;則應把一份 3 + 1 替換爲 2 + 2,因爲2×2>3×1。
class Solution {
public:
int cuttingRope(int n) {
if(n<=1) return 0;
if(n==2) return 1;
if(n==3) return 2;
if(n==4) return 4;
long res = 1;
while(n>4){
res*=3;
//res%=1000000007; 數足夠大時,可通過取模降低,防止超出整數範圍
n-=3;
}
return res*n; //return (int) res*n%1000000007;
}
};
總結一下,不難發現其中的運算規律;不管多大的數,最終都是歸結爲2,3和4這三個數字的乘積,且數字3是根本(數字4可以認爲是“2+2”,所以數字2和3是兩個十分重要的數字,進一步會發現數字3的指數上升速度是比2更快的,比如一根繩子長爲6,可分爲兩段:3+3,也可分爲三段:2+2+2,明顯前者得到的m更大,前者是9,後者是8)。
因此,無論多大的數,分解到最後大部分繩子的長度都將是3。