版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangjingao/article/details/86549955
三角形最小路径和(Triangle)java_leetcode120
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangjingao/article/details/86549955
题目
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
思路
整个数据结构类似斐波那契,以一个正三角下来,除去每行最边上,每个位置的最小路径等于肩上两个位置最小值和自己的值相加。那么就看出来了,这是一个妥妥的动态规划算法。对于排列起来就是:每一行第一个和最后一个都是上一行的第一个和最后一个的值加上当前的值,而中间的数是它的上一行的它的前一列和它同列的两个数的较小值加上它自己的值, 那么动态规划方程为:temp[j] = Math.min(min[j-1],min[j]) + triangle.get(i).get(j);
代码
public int minimumTotal(List<List<Integer>> triangle) {
int len = triangle.size();
int minLen = triangle.get(len-1).size();
int[] min = new int[minLen+1];
min[0] = triangle.get(0).get(0);
for (int i = 1; i < triangle.size(); i++) {
int[] temp = new int[minLen+1];
for (int j = 0; j < triangle.get(i).size(); j++) {
int lastLen = triangle.get(i-1).size();
if (j == 0) {
temp[j] = min[j] + triangle.get(i).get(j);
} else {
if (lastLen >= j+1) {
temp[j] = Math.min(min[j-1],min[j]) + triangle.get(i).get(j);
} else {
temp[j] = min[j-1] + triangle.get(i).get(j);
}
}
}
min = temp;
}
int minValue = min[0];
for (int i = 1; i < minLen; i++) {
if (min[i] < minValue) {
minValue = min[i];
}
}
return minValue;
}