【JS每日一算法】🟨114.三角形最小路径和(动态规划)

260 阅读1分钟

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。

提示:

  • 1 <= triangle.length <= 200
  • triangle[0].length == 1
  • triangle[i].length == triangle[i - 1].length + 1
  • -104 <= triangle[i][j] <= 104  

示例 1:

输入: triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出: 11
解释: 如下面简图所示:
   2
  3 4
 6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

示例 2:

输入: triangle = [[-10]]
输出: -10

题解:

个人博客

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 动态规划   TC:O(n^2)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} triangle  给定二维数组
 * @return {*}
 */
function dp(triangle) {
    /**
     * 该方案使用动态规划,试想如下例子:
     * 1
     * 1 2
     * 1 2 3
     * 
     * 对于第二行可得路径和为[2,3],第三行
     * 路径和为[3,(4, 5),6],因此我们可得出
     * 对于第i行j列,其路径和为
     * f[i][j]+=f[i-1][j]  j==0
     * f[i][j]+=min(f[i-1][j],f[i-1][j-1]) j!=0
     * 
     * 根据此编写代码即可
     */
    for (let i = 1; i < triangle.length; i++) {
        triangle[i][0] += triangle[i - 1][0];
        let j = 1;
        for (; j < triangle[i].length - 1; j++) {
            triangle[i][j] += Math.min(triangle[i - 1][j], triangle[i - 1][j - 1])
        }
        triangle[i][j] += triangle[i - 1][j - 1]
    }
    return Math.min(...triangle[triangle.length - 1])
}