剑指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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值