给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
提示:
1 <= triangle.length <= 200triangle[0].length == 1triangle[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
题解:
/**
* @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])
}