《劍指offer》 面試題14. 剪繩子

題目描述

給你一根長度爲 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。

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