120.Triangle

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

一、空间复杂度O(n^2)
  一共有n行,那么所占空间为n*(n+1)/2的一维数组,从上往下填表,由于下一个值的得出需要上一个值,所以从上往下填表需要设置两个临时变量进行倒换,比较麻烦;且从上往下填表的最终结果需要在最底行中找最小值。

二、空间复杂度O(n)
  填表是一个双重循环,在内循环中,值的得出依赖于前i个数,i最大为n,所以我们只需要重复利用O(n)空间就可以完成双循环。

三、从下往上填表
  不需要设置两个变量倒换,可以直接覆盖之前的值;且最后的结果输出DP[0]即可。

public class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int row = triangle.size();
        int[] DP = new int[row];
        for(int i = 0; i < row; i++) {
            DP[i] = triangle.get(row-1).get(i);
        }
        for(int i = row - 2; i >= 0; i--) {
            for(int j = 0; j <= i; j++) {
                DP[j] = Math.min(DP[j], DP[j+1]) + triangle.get(i).get(j);
            }
        }
        return DP[0];
    }
}
原文地址:https://www.cnblogs.com/season-peng/p/6713493.html