欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

剑指offer:js实现剪绳子

程序员文章站 2022-07-10 10:26:09
...

题目:给你一根长度为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);
    }
相关标签: offer