剑指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
下一篇: 用两个栈实现队列_剑指offer
推荐阅读
-
【Python】剑指offer 14:剪绳子
-
剑指offer 剪绳子(动态规划) Java
-
剑指offer之队列中的最大值(C++/Java双重实现)
-
剑指offer笔记面试题2----实现Singleton模式
-
剑指offer之在排序数组中查找数字 I(C++/Java双重实现)
-
leetcode中剑指offer的习题 C++语言实现(2)
-
leetcode中剑指offer的习题 C++语言实现(1)
-
剑指offer(Java实现)56 - 数组中只出现一次的两个数字
-
【剑指Offer】 40.数组中只出现一次的数字 python实现
-
【剑指Offer】40. Python实现数组中只出现一次的数字