给定一个三角形 triangle
,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i
,那么下一步可以移动到下一行的下标 i
或 i + 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
嗯,动态规划,和上一题区别不大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】下降路径最小和,基本都非常一致
发表评论