Q:
给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,
例如,给出的三角形如下:
[↵ [2],↵ [3,4],↵ [6,5,7],↵ [4,1,8,3]↵]
最小的从顶部到底部的路径和是2 + 3 + 5 + 1 = 11。
注意:
如果你能只用O(N)的额外的空间来完成这项工作的话,就可以得到附加分,其中N是三角形中的行总数。
A:
min数组,复用一个长度triangle.size()大小的数组记录
上一层元素的构成的小三角的最小路径和,状态转移方程
f(i,j) = min(f(i+1, j)+triangle[i][j], f(i+1, j+1)+triangle[i][j])
public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
if (triangle.isEmpty())
return 0;
int[] min = new int[triangle.size()];
for (int i = 0; i < min.length; i++) {
min[i] = triangle.get(triangle.size() - 1).get(i);
}
for (int i = triangle.size() - 2; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
min[j] = Math.min(min[j] + triangle.get(i).get(j), min[j + 1] + triangle.get(i).get(j));
}
}
return min[0];
}