题目链接
leetcode在线oj题——三角形最小路径和
题目描述
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 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)。
输入:triangle = [[-10]]
输出:-10
题目提示
- 1 <= triangle.length <= 200
- triangle[0].length == 1
- triangle[i].length == triangle[i - 1].length + 1
- -104 <= triangle[i][j] <= 104
解题思路
这道题和上一篇博客——不同路径类似,我们可以通过动态规划来解题
题目告诉我们,每一步只能移动到下一行中相邻的结点上,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。也就是说,我们想要到达arr[i][j]这个格子,有两种走法,一个是从arr[i - 1][j - 1],另外一种就是从arr[i - 1][j],局部中最优的走法就是从arr[i - 1][j - 1]和arr[i - 1][j]中取较小者
因此,我们可以从三角形的最顶端开始,往下进行遍历,构造一个和三角形相同大小的数组arr,arr[0][0]就是triangle.get(0).get(0)
按照刚才讲的原理,我们的arr[i][j] = Math.min(arr[i - 1][j], arr[i - 1][j - 1]) + triangle.get(i).get(j);
需要注意的是,由于三角形下面一行比上面一行多出来一个元素,因此一行中的最后一个元素只能从上一行中最后一个元素走到,因此arr[i][i] = arr[i - 1][i - 1] + triangle.get(i).get(i);
我们最后只需要遍历arr的最后一行,取其中的最小值返回即可
详细过程可以参考下图
完整代码
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int size = triangle.size();
int[][] arr= new int[size][size];
arr[0][0] = triangle.get(0).get(0);
for (int i = 1; i < size; i++) {
arr[i][0] = arr[i - 1][0] + triangle.get(i).get(0);
for (int j = 1; j < i; j++) {
arr[i][j] = Math.min(arr[i - 1][j], arr[i - 1][j - 1]) + triangle.get(i).get(j);
}
arr[i][i] = arr[i - 1][i - 1] + triangle.get(i).get(i);
}
int min = arr[size - 1][0];
for (int i = 1; i < size; i++) {
if (arr[size - 1][i] < min){
min = arr[size - 1][i];
}
}
return min;
}
}