本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 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)。
题目解析
思路一
我们从下往上遍历,在把数组的第一个数拿出来,用此方法要改变原数组,从倒数第二行开始,获取里面的每个值,让它加上,下一行中的下标与它相同与下标+1的值并拿出它俩的最小值的那个,来覆盖到它本身这样就会得到它的最小值,依次执行,从下往上,最后最顶端就会得到这个三角形的最小路径和
/**
* @param {number[][]} triangle
* @return {number}
*/
var minimumTotal = function(triangle) {
for(let i=triangle.length-2;i>=0;i--){
for(let j=0;j<triangle[i].length;j++){
triangle[i][j] = triangle[i][j] + Math.min(triangle[i+1][j],triangle[i+1][j+1]);
}
}
return triangle[0][0];
};
思路二
我们这里从下往上递推,并使用滚动数组,先从简单的二维状态来看,上一层的某个节点的路径长度的二维状态方程
dp[i][j] = Math.min( dp[i+1][j] + dp[i+1][j+1] )+ triangle[i][j],在进行降维让每一层都是通过下一层的路径长度得到对应的总路径dp[j] = Math.min( dp[j] + dp[j+1] ) + triangle[i][j],dp[j]和dp[j+1]为下一层的总路径,我们的初始状态为最后一层各个的路径长度为triangle最后一层的长度,在进行遍历从倒数第二层到最后一层,每一层列的数量为层数,滚动数组重复记录从下往上走到每一列的路径长度,直到第一层dp[0]即为最小路径长度
var minimumTotal = function(triangle) {
const m = triangle.length;
if(m == 1) return triangle[0][0];
const dp = [...triangle[m-1]];
for(let i = m-2; i>=0; i--) {
for(let j=0; j<=i; j++) {
dp[j] = Math.min(dp[j], dp[j+1]) + triangle[i][j];
}
}
return dp[0];
};