[ CodeWar ] - 011:最短路径

403 阅读2分钟

系列文章

题目

img-01

这道题灵感来自欧拉计划的 18 题,逼格满满,我们先来理一下题意:

  • 传入的值是一个金字塔型的数组
  • 要找到一条路径,这个路径需要满足以下条件
    • 这条路径只能从相邻的数中选择:比如上图中第三行的 3, 它能选择的数字只有 5, 9, 3
    • 这条路径上各个数字相加之和为所有路径中的最大值

要同时满足这两个条件还是挺麻烦的,并且在最后的需求中也提到了:

My tests include some extraordinarily high pyramids so as you can guess, brute-force method is a bad idea unless you have a few centuries to waste. You must come up with something more clever than that.

意思是暴力枚举的方法肯定过不了单测。

那么元芳,你怎么看呢?

解析

显然,对于这种类似走迷宫的问题,从终点往出发点走是一条比较常规的思路。

以题目中的小金字塔为例,我们将金字塔颠倒过来看看:

img-02

我们将注意力放在前两行,显然:

  • 2 + max(8, 5) = 10
  • 4 + max(5, 9) = 13
  • 6 + max(9, 3) = 15

我们可以将其改写为:

img-03

以此类推,我们可以得到最后的三角形:

img-04

到了这里,相信逻辑以及比较清晰了:

const longestSlideDown = (pyramid) =>
  pyramid.reduceRight((pre, cur) =>
    cur.map((n, i) => n + Math.max(pre[i], pre[i + 1]))
  )[0];