题目:
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分
实现思路:
第i层,第j个位置,到下一层i+1层的最短距离记为r[i][j],则r[i][j] = triangle[i][j]+min{r[i+1][j],r[i+1][j+1]} 则 res = r[0][0] = triangle[0][0]+min{r[1][0],r[1][1]} r[1][0] = triangle[1][0]+min{r[2][0],r[2][1]} r[1][1] = triangle[1][1]+min{r[2][1],r[2][2]} ..... 我们从最后一层开始, 可以知道最后一层的最短距离就是最后一层的值。 r[length][0] =triangle[length][0] r[length][1] =triangle[length][1] ... 倒数第二层的值到最后一层的最短距离为: r[length-1][0] = triangle[length][0]+min{r[length][0],r[length][1]} r[length-1][1] = triangle[length][1]+min{r[length][1],r[length][2]} ... 依次往上,直到计算到第一层。
实现代码:
class leeocode120 {
public int minimumTotal(List<List<Integer>> triangle) {
int length = triangle.size();
Integer[] mins = new Integer[length];
triangle.get(length-1).toArray(mins);
for(int i = length-2 ;i >= 0;i--){
List<Integer> temp = triangle.get(i);
for(int j = 0; j < temp.size() ;j++){
mins[j] = temp.get(j)+Math.min(mins[j],mins[j+1]);
}
}
return mins[0] ;
}
}