使用一个相同形状的数组来存放到达当前坐标的最小和
我们可以使用 动态规划(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]);
};