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
1
2
3
4
5
6
| [
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
|
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.
Solution:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| class Solution {
public int minimumTotal(List<List<Integer>> tree) {
if (tree.size() == 0) {
return 0;
}
for (int level = tree.size() - 2; level >= 0; level--) {
// [1]
List<Integer> currentLevel = tree.get(level); // [1 2]
List<Integer> nextLevel = tree.get(level+1); // [1 4 5]
for (int col = 0; col < currentLevel.size(); col++) {
int minSum = Math.min(
currentLevel.get(col) + nextLevel.get(col),
currentLevel.get(col) + nextLevel.get(col + 1)
);
currentLevel.set(col, minSum);
}
}
return tree.get(0).get(0);
}
}
|
Solution 2#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int n = triangle.size();
if (n == 1) return triangle.get(0).get(0);
int i = n - 2;
while (i >= 0) {
List<Integer> level = triangle.get(i);
List<Integer> nextLevel = triangle.get(i + 1);
for (int row = 0; row < level.size(); row++) {
int min = Math.min(nextLevel.get(row), nextLevel.get(row + 1));
int value = min + level.get(row);
level.set(row, value);
}
i--;
}
return triangle.get(0).get(0);
}
}
|