题目
假设你有一个金字塔结构的数据,从金字塔顶端到底部,寻找一条最长的路径。比如:
/3/
\7\ 4
2 \4\ 6
8 5 \9\ 3
你能得到的最长路径是:3 + 7 + 4 + 9 = 23
问题来了,请写出一个方法longestSlideDown
,你能找到最长的路劲,例:longestSlideDown([[3], [7, 4], [2, 4, 6], [8, 5, 9, 3]]) => 23
思路
- 从底部开始,把倒数第二层每个元素,分别加上下一层的相邻元素(可以选的下一步),把最大的一个(最优的下一步)作为这层(倒数第二层)的新元素。
- 以题目中的示例数组为例:
3
7 4
2 4 6
8 5 9 3
- 最底下的一层是
8 5 9 3
,倒数第二层是2 4 6
- 2可以选择下一层的8或者5作为下一步,而2+8>2+5,故把2+8=10,取代2
- 4可以选择下一层的5和9作为下一步,而4+9>4+5,故把4+9=13,取代4的位置
- 同理6+9>6+3,15取代了6
- 倒数第二层就变成了
10 13 15
,去掉最后一层,把倒数第二层最为新的最后一层,得到新的数据:
3
7 4
10 13 15
- 同理,数据变成:
3
20 19
-最后得到最大路径23
实现
function longestSlideDown (pyramid) {
var len = pyramid.length
if(len==1){
return pyramid[0][0]
}else{
pyramid[len-2] = pyramid[len-2].map((v,i)=>{
return Math.max(v+pyramid[len-1][i],v+pyramid[len-1][i+1])
})
pyramid.pop()
return longestSlideDown(pyramid)
}
}
更好的实现方法
function longestSlideDown (pyramid) {
return pyramid.reduceRight((last,current)=>current.map(
(v,i)=>v+Math.max(last[i],last[i+1])
))[0];
}
网友评论