题目描述
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
For example, given the following triangle
The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).
Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.
分析
定义一个数组K,自下向上存储结果,当处理到第一行时,K[0]就是结果。
在本题中,数组K分别是:
[7, 6, 10, 3]
[9, 10, 10, 3]
[11, 10, 10, 3]
存储结果的部分是:
[7, 6, 10]
[9, 10]
[11]
分析数字7,是题目输入的第三行的6,与其下面相邻的4和1的组合,取最小值;
分析数字9,是题目输入的第二行的3,与数组[7, 6, 10]中的7和6的组合,取最小值。
核心代码是:
for (int i = s.length - 2; i >= 0; i--) {
List<Integer> list = triangle.get(i);
for (int j = 0; j <= i; j++) {
s[j] = list.get(j) + Math.min(s[j], s[j + 1]);
}
}
代码
public static int minimumTotal(List<List<Integer>> triangle) {
int size = triangle.size();
if (size == 0) {
return 0;
}
if (size == 1) {
return triangle.get(0).get(0);
}
int[] s = new int[size];
int k = 0;
for (Integer v : triangle.get(size - 1)) {
s[k++] = v;
}
for (int i = s.length - 2; i >= 0; i--) {
List<Integer> list = triangle.get(i);
for (int j = 0; j <= i; j++) {
s[j] = list.get(j) + Math.min(s[j], s[j + 1]);
}
}
return s[0];
}