題目描述
給你一根長度爲n的繩子,請把繩子剪成整數長的m段(m、n都是整數,n>1並且m>1),每段繩子的長度記爲k[0],k[1],…,k[m]。請問k[0]xk[1]x…xk[m]可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別爲2、3、3的三段,此時得到的最大乘積是18。
輸入描述:
輸入一個數n,意義見題面。(2 <= n <= 60)
輸出描述:
輸出答案。
示例1
輸入
8
輸出
18
這種題一般有一個數學規律,我們還是先列舉前面幾個看看。
當n = 2時,此時需要分成1、1,最大結果爲1 * 1 = 1(注意m > 1,即至少分成兩段)
當n = 3時,此時需要分成2、1,最大結果爲2 * 1 = 2(注意m > 1,即至少分成兩段)
當n = 4時,分成2、2,最大結果爲2 * 2 = 4
當n = 5時,分成3、2,最大結果爲3 * 2 = 6
當n = 6時,分成3、3,最大結果爲3 * 3 = 9
當n = 7時,分成3、2、2,最大結果爲3 * 2 * 2 = 12
當n = 8時,分成3、3、2,最大結果爲3 * 3 * 2 = 18
...
可以看出一個規律,n應該儘量多分成3,當n = 2、n = 3是特殊情況,需要單獨考慮。並且如果n % 3 == 1時,這時需要分出2 * 2,不能單出1。比如7分成2 * 2 * 3
數學解釋參考下圖(評論區搬運,感謝初亦澤)
class Solution {
public:
int cutRope(int number) {
int res = 0;
if(number == 2){
//特殊情況
res = 1;
}else if(number == 3){
//特殊情況
res = 2;
} else if (number % 3 == 1) {
//number % 3 == 1,需要分出2 * 2,否則會單出1
res = pow(3, number / 3 - 1) * 4;
} else if (number % 3 == 2) {
//儘量分出3,單獨留出2
res = pow(3, number / 3) * 2;
} else {
//能整除3,就全分成3
res = pow(3, number / 3);
}
return res;
}
};
題1、LeetCode 簡化路徑
題2、LeetCode 兩數相除
題3、LeetCode 串聯所有單詞的子串