1. 程式人生 > >劍指offer-剪繩子問題(Java)

劍指offer-剪繩子問題(Java)

文章目錄

問題描述

給你一根長度為n的繩子,請把繩子剪成m段 (m和n都是整數,n>1並且m>1)每段繩子的長度記為k[0],k[1],…,k[m].請問k[0]k[1]…*k[m]可能的最大乘積是多少

解析

如果我們按照如下的策略來剪繩子,則得到的各個段繩子的長度的乘積將最大:當n>=5時,我們儘可能多的剪長度為3的繩子;當剩下的繩子長度為4時,把繩子剪成兩段長度為2的繩子。

程式碼

private int maxProductAfter(int n) {
    if (n < 2) {
        return 0;
    }
    if (n == 2) {
        return 1;
    }
    if (n == 3) {
        return 2;
    }
    int times3Of = n / 3;
    if (n % 3 == 1) {
        return (int) Math.pow(3, (times3Of - 1)) * 4;
    }
    if (n % 3 == 0) {
        return (int) Math.pow(3, times3Of);
    }
    return (int) Math.pow(3, times3Of) * 2;
}