给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 ii + 1

 

示例 1:

输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:
   2
  3 4
 6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

示例 2:

输入:triangle = [[-10]]
输出:-10

 

提示:

  • 1 <= triangle.length <= 200
  • triangle[0].length == 1
  • triangle[i].length == triangle[i - 1].length + 1
  • -104 <= triangle[i][j] <= 104

 

进阶:

  • 你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题吗?
Related Topics
  • 数组
  • 动态规划

  • 👍 842
  • 👎 0
  • 嗯,动态规划,和上一题区别不大LeetCode刷题【256】粉刷房子

    class Solution {
        public int minimumTotal(List<List<Integer>> triangle) {
            int[][] dp = new int[triangle.size()+1][triangle.size()+1];
            for (int i = triangle.size()-1; i >= 0 ; i--) {
                for (int j = 0; j <= i; j++) {
                    dp[i][j] = Math.min(dp[i+1][j],dp[i+1][j+1]) + triangle.get(i).get(j);
                }
            }
            return dp[0][0];
        }
    }

    一样的,dp数组因为只依赖前一次的,空间的使用可以重新调整下,使用两个int[triangle.size()+1]的数组来完成即可。

    上面的代码是自下而上的遍历过程,其实也可以自上而下来处理,不过相对的代码有点不一样,每一行需要判断索引0的位置的不能取到上一层的索引为-1的位置的值比较,因为索引-1不存在。

    另外一个,遍历到最下一层的时候需要在最后一层中再次遍历下,找到这一层的最小值返回。

    另一个一个和本题相似度非常高的题目LeetCode刷题【931】下降路径最小和,基本都非常一致