注意:每一步只能移动到下一行中相邻的结点上。题目要求只能使用O(n)的额外空间来解决问题。
思路:
这是一个典型的动态规划问题,下一个节点只能通过上一层节点左侧或者右侧;我们可以得到递推式:
minPath[i] = 当前点值 + min(上一层的左边点值, 上一层的右边点值)
我们从底到上一次遍历。’
代码如下:
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int lastedRowLength=triangle.get(triangle.size()-1).size();
int[] dp=new int[lastedRowLength];
//将最后一行的元素存起来
for(int i=0;i<lastedRowLength;i++){
dp[i]=triangle.get(triangle.size()-1).get(i);
}
for(int row=triangle.size()-2;row>=0;row--){//从倒数第二行开始
for(int col=0;col<=row;col++){//更新dp中的值
dp[col]=Math.min(dp[col],dp[col+1])+triangle.get(row).get(col);
}
}
return dp[0];
}
}