[LeetCode](面試題14- II)剪繩子 II

題目

給你一根長度爲 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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章