leetcode 算法-三角形最小路径和
题目
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
解题思路
本题是一道动态规划的典型应用题。
首先我们可以得出这样一个关系,设triangle为三角形的矩阵,min为最小路径,i为行索引,j为列索引,min(i,j)为从第i行,第j列到底部的最小路径和,则:min(i,j)=triangle[i][j]+min(i+1,j)+min(i+1,j+1)。
有了这个式子之后,我们还需要一个二维数组来保存min,但是又不能创建新数组,然后我们可以发现triangle正好可以用来保存min,我们需要从底到上遍历,triangle[i][j]用来保存min[i][j],当遍历至顶端的时候,结果也自然计算出来了。
这种方法空间复杂度只有常数级别,只适用了固定的额外空间,速度不是很快,但是也不慢。
代码
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
if (triangle == null || triangle.size() == 0){
return 0;
}
int len = triangle.size();
List<Integer> cur, last = triangle.get(len - 1);
for (int i = len - 2; i >= 0; i--) {
cur = triangle.get(i);
for (int lenI = cur.size(), j = 0, left = last.get(0); j < lenI; j++) {
cur.set(j, cur.get(j) + Math.min(left, left = last.get(j + 1)));
}
last = cur;
}
return triangle.get(0).get(0);
}
}