題目
給你一根長度爲 n
的繩子,請把繩子剪成整數長度的 m
段(m、n都是整數,n>1並且m>1),每段繩子的長度記爲 k[0],k[1]...k[m]
。請問 k[0]*k[1]*...*k[m]
可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別爲2、3、3的三段,此時得到的最大乘積是18。
答案需要取模 1e9+7(1000000007),如計算初始結果爲:1000000008,請返回 1。
示例 1:
輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1
示例 2:
輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
提示:
2 <= n <= 1000
解題思路
詳細思路請參考 面試題14- I. 剪繩子
注:這裏多了個大數取餘運算
代碼
class Solution {
public int cuttingRope(int n) {
// 特殊情況
if(n<2){
return 0;
}
if(n==2){
return 1;
}
if(n==3){
return 2;
}
// 其他情況
// 儘可能地多剪成3
int time3 = n/3;
int nextLen = n - 3*time3;
// 如果最後剩下的長度爲1,那麼從3那裏拿出1來湊成2*2,因爲 2*2>3*1
if(nextLen == 1){
time3--;
}
int time2 = (n-3*time3)/2;
long res = 1L;
while(time3>0){
res = res *3 % 1000000007;
time3--;
}
res = res * (int)Math.pow(2, time2) % 1000000007;
return (int)res;
}
}