Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
Copy class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
if (triangle.size() == 0) {
return 0;
}
int[] f = new int[triangle.size() * (triangle.size() + 1) / 2];
f[0] = triangle.get(0).get(0);
if (triangle.size() == 1) {
return f[0];
}
int index = 1;
int min = Integer.MAX_VALUE;
for (int i = 1; i < triangle.size(); i++) {
min = Integer.MAX_VALUE;
for (int j = 0; j < triangle.get(i).size(); j++) {
f[index] = triangle.get(i).get(j);
if (j == 0) {
f[index] += f[index - i];
} else if (j == i) {
f[index] += f[index - i - 1];
} else {
f[index] += Math.min(f[index - i], f[index - i - 1]);
}
min = Math.min(f[index], min);
index++;
}
}
return min;
}
}
从下往上会简单很多.
F(i, j)表示从底往上到(i,j)的min path sum. 由于i层的只和i + 1层的相关, 因此空间只用O(N).
Copy class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int n = triangle.size();
int[] f = new int[n + 1];
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
f[j] = triangle.get(i).get(j) + Math.min(f[j], f[j + 1]);
}
}
return f[0];
}
}