triangle

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.

 

题目是要求最小路径,对于一行的数据,每个数据都有可能是最小路径的最后一个元素。
这题找递推公式。对于第k行的数据i处的路径和,sum[k][i]=Math.min(sum[k-1][i-1],sum[k-1][i])+triangle[k][i]。这样求到最后一行时,再求出最后一行的最小值就行。这样只需要一个二维数组就行,然后注意边界情况。
这题是限制了空间,只能使用一个o(n)空间,也就是一维数组。我们重新审查这个三角形,从底下往上看,也就是从下往上计算路径和,sum[k][i]=min(sum[k+1][i],sum[k+1][i+1])+triangle[k][i];因为下一行元素比上一行元素多一个,所以上面式子没有边界问题。我们将上式行号去掉,简化为 一维数组:minlen[i]=Math.min(minlen[i],minlen[i+1])+triangle[k][i];为什么可以省略行号呢,因为用一维数组存数据时,下一行会先计算了存进数组,然后计算上一行,计算上一行时,只与当前元素和后面的有关,与前面的minlen无关,不会覆盖掉有用的下一行路径和数据。仔细体会上面的式子。
最后计算到最后就是将最小路径和放到了minlen[0]。

 

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        if(triangle==null||triangle.size()==0) return 0;
        int[] minLen=new int[triangle.size()+1];//最后多出来的一行 存为0,用于计算最后一行数据。
       
        for(int layer=triangle.size()-1;layer>=0;layer--){
            for(int i=0;i<=layer;i++){
                minLen[i]=Math.min(minLen[i],minLen[i+1])+triangle.get(layer).get(i);
            }
        }
        
        return minLen[0];
    }
}

 

posted on 2018-01-11 14:58  夜的第八章  阅读(142)  评论(0编辑  收藏  举报

导航