题目:
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
[
[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.
题意:
有一个三角型的数组,我们需要自顶向下找到一条路,这条路上的数值之和最小。
解答:
这显然可以用DP来做,我们可以自顶向下搜索,也可以自底向上搜索。
每次只需要比较前一步到后一步所能得到的最小值填入即可。
例如自底向上的步骤
以题目给的示例为例
首先计算倒数第二层所能得到的最小值
[
[2],
[3,4],
[7,6,10], ——————
[4,1,8,3]
]
之后计算倒3
[
[2],
[9,10], ————————————
[7,6,10],
[4,1,8,3]
]
最后很明显结果为11
自底向上的代码:
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
for(int i = triangle.size() - 2; i >= 0; i--)
for(int j = 0; j <= i; j++)
triangle.get(i).set(j, triangle.get(i).get(j) + Math.min(triangle.get(i + 1).get(j), triangle.get(i + 1).get(j + 1)));
return triangle.get(0).get(0);
}
}
自顶向下的代码:
自顶向下时我们需要考虑的比较多,主要是越界的问题,需要一些判断
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int min =99999,x,min_level;
for(int i=1;i<triangle.size();i++){
for(x=0;x<=i;x++){
min_level=0;
if(x-1>=0){
min_level=triangle.get(i-1).get(x-1);
}
if(x<=i-1){
if(min_level==0) min_level=triangle.get(i-1).get(x);
else{
if(min_level>triangle.get(i-1).get(x)) min_level=triangle.get(i-1).get(x);
}
}
triangle.get(i).set(x,min_level+triangle.get(i).get(x));
}
}
for(int j=0;j<triangle.size();j++){
if(min>triangle.get(triangle.size()-1).get(j)) min=triangle.get(triangle.size()-1).get(j);
}
return min;
}
}
768

被折叠的 条评论
为什么被折叠?



