【Daily Interview】- 25 三角形最小路径和

567 阅读1分钟

题目

img01

题目来源:三角形最小路径和 - 力扣

分析

看到这个问题的第一反应可能会有以下想法:只要每一步,都加最小值,就能得到最优解。

上述思路即贪心算法的核心思路:局部最优。

对于示例来说看起来是正确的,然而如果三角形长这样呢?

img02

此时再用贪心算法的思路得到的解就不再是全局最优解了,这也证明了一点:每一次的局部最优走到最后并不一定是全局最优。

对于这种寻找全局最优解的思路通常是动态规划(DP),而这种思路的特点是自下而上,以示例中的三角形为例(这里将三角形倒过来,方便说明):

img03

这里我们可以先计算出前两行的最优解:

  • 6 + min(4, 1) = 7
  • 5 + min(1, 8) = 6
  • 7 + min(8, 3) = 10

此后可以得到下一步的结果:

img04

依次类推,可以得到最后的结果是 11。

那么按照上述思路就能得到最终结果了:

const minimumTotal = (triangle) => 
  triangle.reduceRight((pre, cur) => 
    cur.map((n, i) => n + Math.min(pre[i], pre[i + 1]))
  )[0];

💡:顺带一提,这道题灵感来自欧拉计划的 18 题。