image.png

解决思路

动态规划

自底向上

image.png

  1. public int minimumTotal(List<List<Integer>> triangle) {
  2. //特判
  3. if (triangle == null || triangle.size() == 0)
  4. return 0;
  5. int size = triangle.size();
  6. // 加1可以不用初始化最后一行
  7. // 根据题意,行列值相同
  8. int[][] dp = new int[size+1][size+1];
  9. for (int i = size - 1;i >= 0;i--){
  10. List<Integer> row = triangle.get(i);
  11. for (int j = 0 ;j < row.size();j++){
  12. dp[i][j] = Math.min(dp[i+1][j+1],dp[i+1][j]) + row.get(j);
  13. }
  14. }
  15. return dp[0][0];
  16. }

优化空间

  1. public int minimumTotal(List<List<Integer>> triangle) {
  2. // 特判
  3. if (triangle == null || triangle.size() == 0) {
  4. return 0;
  5. }
  6. // dp中记录了求第i行时,第i+1的最小路径和
  7. int[] dp = new int[triangle.size() + 1];
  8. for (int i = triangle.size() - 1; i >= 0; i--) {
  9. List<Integer> rows = triangle.get(i);
  10. for (int j = 0; j < rows.size(); j++) {
  11. dp[j] = Math.min(dp[j], dp[j + 1]) + rows.get(j);
  12. }
  13. }
  14. return dp[0];
  15. }