120 Triangle
buttom-up DP
这是一道动态规划的题目,求一个三角形二维数组从顶到低端的最小路径和。思路是维护到某一个元素的最小路径和,那么在某一个元素i,j的最小路径和就是它上层对应的相邻两个元素的最小路径和加上自己的值,递推式是sum[i][j]=min(sum[i-1][j-1],sum[i-1][j])+triangle[i][j]。最后扫描一遍最后一层的路径和,取出最小的即可。每个元素需要维护一次,总共有1+2+...+n=n*(n+1)/2个元素,所以时间复杂度是O(n^2)。而空间上每次只需维护一层即可(因为当前层只用到上一层的元素),所以空间复杂度是O(n)
参考:http://blog.csdn.net/linhuanmars/article/details/23230657
public class Solution { public int minimumTotal(List<List<Integer>> triangle) { if (triangle == null || triangle.size() == 0) { return 0; } int n = triangle.size(); int[][] sum = new int[n][n]; for (int i = 0; i < n; i++) { sum[n-1][i] = triangle.get(n-1).get(i); } for (int i = n-2; i>=0; i--) { for (int j = 0; j <= i; j++) { sum[i][j] = Math.min(sum[i+1][j], sum[i+1][j+1]) + triangle.get(i).get(j); } } return sum[0][0]; } }