劍指offer 剪繩子

題目描述
給你一根長度爲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

\color{blue}解題思路:
這種題一般有一個數學規律,我們還是先列舉前面幾個看看。

當n = 2時,此時需要分成11,最大結果爲1 * 1 = 1(注意m > 1,即至少分成兩段)
當n = 3時,此時需要分成21,最大結果爲2 * 1 = 2(注意m > 1,即至少分成兩段)
當n = 4時,分成22,最大結果爲2 * 2 = 4
當n = 5時,分成32,最大結果爲3 * 2 = 6
當n = 6時,分成33,最大結果爲3 * 3 = 9
當n = 7時,分成322,最大結果爲3 * 2 * 2 = 12
當n = 8時,分成332,最大結果爲3 * 3 * 2 = 18
...

可以看出一個規律,n應該儘量多分成3,當n = 2、n = 3是特殊情況,需要單獨考慮。並且如果n % 3 == 1時,這時需要分出2 * 2,不能單出1。比如7分成2 * 2 * 3
數學解釋參考下圖(評論區搬運,感謝初亦澤)
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
\color{blue}代碼實現:

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;
    }
};

在這裏插入圖片描述
\color{blue}題目推薦:
題1、LeetCode 簡化路徑
題2、LeetCode 兩數相除
題3、LeetCode 串聯所有單詞的子串

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章