leetcode算法题,给出一个三角形,计算从三角形顶部到底部的最小路径和
题目:
给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,
例如,给出的三角形如下:
[↵ [2],↵ [3,4],↵ [6,5,7],↵ [4,1,8,3]↵]
最小的从顶部到底部的路径和是2 + 3 + 5 + 1 = 11。
注意:
如果你能只用O(N)的额外的空间来完成这项工作的话,就可以得到附加分,其中N是三角形中的行总数。
思考:
1.有两种方式,一种是从上到下暴力解题,另一种是从下到上暴力解题
2.第一种方式的问题是,如何保存当前层到下一层各个节点最短的路径值,可以新增一个数组来存储,但是由于获得下一层结点的最短路径时,当前数组的各个值会用到两次,那么就不可能在计算下一层的最短结点的时候逐个覆盖当前数组的值,势必需要再增加一个数组,来交替存储最新的最短路径值。但这样不满足O(n)的空间复杂度。那么这种从上到下的解题方式是不是就不行呢,答案是不是,可以用这个三角形数组每一层本身来存储到达当前层的最短路径,这样不需要额外的存储空间。
3第二种方式,需要用到额外的一个数组,temp[n],O(n)的空间复杂度。当计算到达上一层的最短路径并覆盖存储到temp[n]数组时,覆盖的那个节点已经不需要再次使用了,所以不需要再新增一个数组。
第二种方式实现代码
import java.util.*;
public class Solution {
public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
if (triangle.size()==0||triangle==null)
return 0;
//记录三角形的层数
int n=triangle.size();
//创建一个暂存数组,用于存放到达每一层各个节点的最小步数
int[] temp=new int[n];
//从最后一层到第一层的最短距离和从第一层到最后一层的最短距离是一样的,采用从最后一层到第一层可以方便运算
//先初始化temp数组,暂存最后一层的结点
for (int i=0; i<n; i++)
temp[i]=triangle.get(n-1).get(i);
//然后向上运算,到达上一层的最小值,应该是当前层的结点,也就是暂存数组的元素两两比较的最小值和上一层结点的相加
for(int i=n-2; i>=0; i--){
for(int j=0; j<=i; j++){
temp[j]=triangle.get(i).get(j)+Math.min(temp[j],temp[j+1]);
}
}
return temp[0];
}
}