劍指offer:js實現剪繩子

題目:給你一根長度爲n的繩子,請剪成m段n>1,m>1,使剩下的繩子乘積爲最大值.
例:8 => 2 * 3 * 3 = 18

思路:動態規劃,比如8,第一次切割可以分成8-1種切法,將最優解存儲起來。

let n = 8;
function cut(){
    let res = [0,1,2,3];
    return function(n){
        if(n<4){return n-1;}
        if(res[n])return res[n];
        let max = 0;
        for(let i = 4;i<=n;i++){
            max = 0;
            for(let j = 1;j<=i/2;j++){
                let p = res[i-j] * res[j];
                max = max < p ? p : max
            }
            res[i] = max;
        }
        return res[n];
    }
}    
let f = cut();
f(n);

使用閉包存儲數組.

思路2:貪婪算法,如果超過5的話,那麼其實都拆分成了3 和 2 因爲3(n-3)>n,3(n-3)>=2(n-2)
所以我們全部拆分成3 或者 2
如果是10,那麼不能拆分成3 3 3 1 而要拆分成 3 3 2 2

    function cut2(n){
        if(n<4)return n-1;
        let len = ~~(n/3);
        if(n-len*3 == 1)len--;
        let len2 = ~~((n-len*3)/2)
        return Math.pow(2,len2)*Math.pow(3,len);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章