题目链接:https://leetcode.com/problems/triangle/
思路:
用DP解决,本来想着用二维数组,后来发现一位数组同样可以实现。
[ [2], [3,4], [6,5,7], [4,1,8,3] ]
这种可以理解为:
2
3 4
6 5 7
4 1 8 3
对应到list下标,即当前行的第i个下标,只可以利用下一行的i和i+1。
于是我们可以从下向上进行求解。
DP的关键就是找出可以重复利用的子结构:
A[j]=Math.min(A[j],A[j+1])+triangle.get(i).get(j);
具体到这个例子:
i=3 :A[4 1 8 3] 0; 此迭代前A[j]中的元素全为0,所以对应triangle.get(i).get(j)的值。
i=2 : A[7 6 10] 3 0; 从上一层中选取Math.min(A[j],A[j+1])来更新A[j]
i=1 :A[9 10] 10 3 0;
i=0 :A[11]10 10 3 0;
在方括号后面的元素是当前层不再用到的部分。
声明数组大小时比size多了 1 是为了防止求A[j+1]时出现数组越界的情况。
AC 1ms 99.9% Java:
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int[] A=new int[triangle.size()+1];
for(int i=triangle.size()-1;i>=0;i--){
for(int j=0;j<=i;j++){
A[j]=Math.min(A[j],A[j+1])+triangle.get(i).get(j);
}
}
return A[0];
}
}