2020年7月14日 三角形最小路径和 minimumTotal
默认格式:
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
}
}
解题思路:
我一眼就看出你是dp!拆解问题!定义状态!推导方程!代码实现逻辑!
一个节点的值向下传递能够传递给第n个和第n+1个,那么反过来,第n个元素向上传递是由第n-1个和第n个较小的那一个累加得到的。
我们从最后一层开始判断,4和1的上一个是6,我们选择4和6中比较小的那一个加载6的值上,然后判断1和8,把较小的那一个加载5上面。。。
经过这么一步的处理,就把第m层到达第m+1层的最优选择叠加到了第m层,此时到达第m层的最小路径同时也是到达第m+1层的最小路径。
推导方程:
m(n)=m(n)+min(m+1(n),m+1(n+1))
出现问题,实际给的是一个链表,虽然可以直接对链表进行操作,但是效率低下同时操作复杂,所以链表只用来读数据,数据的动态规划用一个新建的数组来实现。
新建一个长度为m的数组,用最后一层的数据给他们赋值。
然后进行动态规划
代码实现:
public int minimumTotal(List<List<Integer>> triangle) {
int len=triangle.size();
int[] res=new int[len];
//初始化数组
for (int i=0;i<len;i++){
res[i]=triangle.get(len-1).get(i);
}
for(int i=len-2;i>=0;i--){
List<Integer> now=triangle.get(i);
//i-1的同时数组长度也-1,所以可以用i来代替
for (int j=0;j<=i;j++){
res[j]=now.get(j)+Integer.min(res[j],res[j+1]);
}
}
if (res.length>0)
return res[0];
else
return 0;
}