[
[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];
}
}