【Leetcode】120. 三角形最小路径和

32 阅读1分钟

leetcode-120.png

使用一个相同形状的数组来存放到达当前坐标的最小和

我们可以使用 动态规划(DP)  来解决。

定义 dp[i][j] 表示到达位置 (i, j) 的最小路径和。
因为 (i, j) 只能从上一行的 (i-1, j-1) 或 (i-1, j) 走下来,所以转移方程为:

lua
复制编辑
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j]

注意边界情况:

  • 每行的第一个元素 j = 0 只能从上一行的 j = 0 走下来;
  • 每行的最后一个元素 j = triangle[i].length - 1 只能从上一行的最后一个位置 j-1 走下来。
var minimumTotal = function (triangle) {
    let n = triangle.length;
    // 初始化 dp,复制第一行
    let dp = new Array(n).fill(0).map(() => []);
    dp[0][0] = triangle[0][0];
    for (let i = 1; i < triangle.length; ++i) {
        for (let j = 0; j < triangle[i].length; ++j) {
            if (j === 0) {
                dp[i][j] = dp[i - 1][j] + triangle[i][j];
            } else if (j === triangle[i].length - 1) {
                dp[i][j] = dp[i - 1][j - 1] + triangle[i][j];
            } else {
                dp[i][j] =
                    Math.min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j];
            }
        }
    }
    return Math.min(...dp[n - 1]);
};