给定一个三角形 triangle ,求解自顶向下的最小路径和。采用动态规划算法,感觉和力扣的答案差不多,都是做了双层循环,但排名比较低,不知道为啥?
package likou;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*
* 120.三角形最小路径和
* 题干:
* 给定一个三角形 triangle ,找出自顶向下的最小路径和;
* 每一步只能移动到下一行中相邻的结点上;
* 相邻的结点在这里指的是下标与上一层结点下标相同或者等于上一层结点下标+1的两个结点;
* 也就是说,如果正位于当前行的下标 i,那么下一步可以移动到下一行的下标 i或i+1;
*/
public class Demo120 {
/*
* 解题思路:像这种求解最大值或者最小值相关的问题,计算第i个元素的值,只和i-1个元素相关,
* 这里第一感觉就是想着转为动态规划问题。
* 根据题意,最后一个节点假设是i时,则最终值肯定只和经过上一行的i-1或者i个节点的最小路径和有关
* 因此,可定义一个数组int[] upArray代表上一行的最小路径和,
* int[] currentArray代表经过当前节点的最小路径和
* 最后就可将求解最小路径问题转为求currentArray数组的最小值问题
*
*/
public int minimumTotal(List<List<Integer>> triangle) {
int size = triangle.size();
List<Integer> list = triangle.get(0);
if(size == 1) {
return list.get(0);
}
List<Integer> tempList1 = triangle.get(1);
int tempValue1 = list.get(0);
list.set(0, tempValue1+tempList1.get(0));
list.add(tempValue1+tempList1.get(1));
if(size == 2) {
return Math.min(list.get(0), list.get(1));
}
for(int i=2;i<size;i++) {
List<Integer> tempList = triangle.get(i);
Integer[] currentArray = new Integer[i+1];
currentArray[0] = list.get(0)+tempList.get(0);
for(int j=1;j<i;j++) {
int tempValue = Math.min(list.get(j-1), list.get(j));
currentArray[j] = tempValue+tempList.get(j);
}
currentArray[i] = list.get(i-1)+tempList.get(i);
list = Arrays.asList(currentArray);
}
int returnValue = Integer.MAX_VALUE;
for(int k=0;k<list.size();k++) {
returnValue = Math.min(returnValue, list.get(k));
}
return returnValue;
}
public static void main(String args[]) {
Demo120 demo = new Demo120();
List<Integer> list1 = new ArrayList<Integer>();
list1.add(2);
List<Integer> list2 = new ArrayList<Integer>();
list2.add(3);
list2.add(4);
List<Integer> list3 = new ArrayList<Integer>();
list3.add(6);
list3.add(5);
list3.add(7);
List<Integer> list4 = new ArrayList<Integer>();
list4.add(4);
list4.add(1);
list4.add(8);
list4.add(3);
List<List<Integer>> triangle = new ArrayList();
triangle.add(list1);
triangle.add(list2);
triangle.add(list3);
triangle.add(list4);
System.out.println(demo.minimumTotal(triangle));
}
}