Leetcode原题链接:
https://oj.leetcode.com/problems/triangle/
动态规划的题目,f[i][j] 表示某点到最后底部的最短值。
第一步: 先计算出最后一排的最短值,实际上就是这一排本身的值。
第二步:From bottom to up, 每一层的最短值只需要把自身值加上,并且取下层的左右邻接点的最小值。
代码如下:
https://oj.leetcode.com/problems/triangle/
动态规划的题目,f[i][j] 表示某点到最后底部的最短值。
第一步: 先计算出最后一排的最短值,实际上就是这一排本身的值。
第二步:From bottom to up, 每一层的最短值只需要把自身值加上,并且取下层的左右邻接点的最小值。
代码如下:
public class Solution {
public int minimumTotal(ArrayList
> triangle) {
int n = triangle.size();
int sum[][] = new int[n][n];
// bottom up. first get the last line's min value.
for (int i = 0; i < n; i++) {
sum[n - 1][i] = triangle.get(n - 1).get(i);
}
for (int i = n - 2; i >= 0; i --) {
for (int j = 0; j <= i; j++) {
sum[i][j] = Math.min(sum[i + 1][j], sum[i + 1][j + 1]) + triangle.get(i).get(j);
}
}
return sum[0][0];
}
}
如果要实现O(n)空间复杂度,则只需要在原有的List上不断更新即可,代码如下:
public class Solution {
public int minimumTotal(List
> triangle) {
if (triangle == null || triangle.size() == 0) {
return 0;
}
int row = triangle.size();
ArrayList
ret = new ArrayList
(triangle.get(row - 1));
for (int i = row - 2; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
ret.set(j, Math.min(ret.get(j), ret.get(j + 1)) + triangle.get(i).get(j));
}
}
return ret.get(0);
}
}