1. 程式人生 > 實用技巧 >劍指 Offer 14- II. 剪繩子 II + 貪心 + 數論 + 快速冪

劍指 Offer 14- II. 剪繩子 II + 貪心 + 數論 + 快速冪

劍指 Offer 14- II. 剪繩子 II

題目連結

因為有取模的操作,動態規劃中max不能用了,我們觀察:正整數從1開始,但是1不能拆分成兩個正整數之和,所以不能當輸入。
2只能拆成 1+1,所以乘積也為1。
數字3可以拆分成 2+1 或 1+1+1,顯然第一種拆分方法乘積大為2。
數字4拆成 2+2,乘積最大,為4。
數字5拆成 3+2,乘積最大,為6。
數字6拆成 3+3,乘積最大,為9。
數字7拆為 3+4,乘積最大,為 12。
數字8拆為 3+3+2,乘積最大,為 18。
數字9拆為 3+3+3,乘積最大,為 27。
數字10拆為 3+3+4,乘積最大,為 36。
那麼通過觀察上面的規律,我們可以看出從5開始,數字都需要先拆出所有的3,一直拆到剩下一個數為2或者4,因為剩4就不用再拆了,拆成兩個2和不拆沒有意義,而且4不能拆出一個3剩一個1,這樣會比拆成 2+2 的乘積小。

package com.walegarrett.offer;

/**
 * @Author WaleGarrett
 * @Date 2020/12/10 18:56
 */
public class Offer_14_2 {
    public int cuttingRope(int n) {
        if(n ==2 || n == 3)
            return n-1;
        long ans = 1;
        while(n > 4){
            ans = ans * 3 % 1000000007;
            n -= 3;
        }
        return (int)((ans * n) % 1000000007);
    }
}