题目描述: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.
解题思路:根据题目中的描述,并且要尽量控制额外空间为原始数组的大小,因此,本文中考虑使用动态规划的思想来解决。用一个List<List<Integer>> result来保存结果。从最后一列开始,三角矩阵中最后一列每个元素的的最小路径即为本身,然后依次向上循环,加上与其相邻的最小的路径,即可得到 最终结果。
代码:
public int minimumTotal(List<List<Integer>> triangle) {
int l=triangle.size();
int m=l-1;
List<List<Integer>> result=new ArrayList<List<Integer>>();
while(m>=0){
List<Integer> sublist=triangle.get(m);
List<Integer> sub=new ArrayList<Integer>();
for(int i=0;i<sublist.size();i++){
if(m==l-1){
sub.add(sublist.get(i));
}
else{
//下面一行的数据其左邻居比右邻居小时,用右邻居做路径
if(result.get(l-m-2).get(i)<result.get(l-m-2).get(i+1)){
sub.add(sublist.get(i)+result.get(l-m-2).get(i));
}
else{
sub.add(sublist.get(i)+result.get(l-m-2).get(i+1));
}
}
}
result.add(sub);
m=m-1;
}
return result.get(l-1).get(0);
}