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).
分析:
典型的DP问题~但是还是做不到独立解决!已经可以推导出递推公式了,但是问题是我想new一个和triangle同样大小的List,然后保存每个位置的最小结果,从后往前递归可以求出结果,但是我傻,没想到怎么初始化,其实可以直接List<List<Integer>> copy = new ArrayList<ArrayList<Integer>>(triangle)!但是这种方法会浪费空间。
从前往后看就是找到下一层左右两个元素中较小的那个加上该元素,但是如果这样的话需要便利多次,那么从后往前,用一个数组保存下一层求和结果,然后找到左右两个中小的那个,加上当前元素。当前index=i的元素对应下一层左右就是i, i+1.
实际上,直接new一个数组或者List, 大小等于最后一层的大小(最大)就可以了,因为从后往前找最小值的时候只会用到下一层的结果~~这里我们可以发现最后一层的大小等于层数,但是我第一遍的时候int[] layer = new int[triangle.size()]会报错OOI~~为什么呢?因为最后一层更新的时候Math,min(layer[j], layer[j+1]),会访问j+1个元素,所以我们int[] layer = new int[triangle.size()+1]就好啦!!
public int minimumTotal(List<List<Integer>> triangle) {
if(triangle == null)
return 0;
int[] layer = new int[triangle.size()+1];//注意这里大小
for(int i=triangle.size()-1;i>=0;i--){
for(int j=0;j<triangle.get(i).size();j++){
layer[j] = Math.min(layer[j],layer[j+1]) + triangle.get(i).get(j);//注意求最小值是在新建数组中,新建的数组保存的是下一层左右两个元素的结果
}
}
return layer[0];
}