我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/triangle/description/
题目描述:
知识点:递归动态规划
思路一:递归实现
从第一层开始,递归地求解第n层的最小路径和。
时间复杂度和空间复杂度均是O(n ^ 2)。
JAVA代码:
public class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
List<Integer> list = new ArrayList<>();
list.add(triangle.get(0).get(0));
List<Integer> lastList = generateNextSum(list, 1, triangle);
int minIndex = 0;
for (int i = 0; i < lastList.size(); i++) {
if(lastList.get(i) < lastList.get(minIndex)) {
minIndex = i;
}
}
return lastList.get(minIndex);
}
/*
* 生成第n层的和,list中记录着第n - 1层的和
*/
private List<Integer> generateNextSum(List<Integer> list, int n, List<List<Integer>> triangle) {
if(n == triangle.size()) {
return list;
}
List<Integer> retList = new ArrayList<>();
for (int j = 0; j < triangle.get(n).size(); j++) {
if(j == 0) {
retList.add(list.get(0) + triangle.get(n).get(0));
}
if(j > 0 && j < triangle.get(n).size() - 1) {
retList.add(Math.min(list.get(j - 1), list.get(j)) + triangle.get(n).get(j));
}
if(j == triangle.get(n).size() - 1) {
retList.add(list.get(list.size() - 1) + triangle.get(n).get(triangle.get(n).size() - 1));
}
}
return generateNextSum(retList, n + 1, triangle);
}
}
LeetCode解题报告:
思路二:动态规划
对于每一层的最小路径和,只和当前层的数值以及前一层的最小路径和有关。我们只需一个list1记录前一层的最小路径和,另一个list2根据list1和当前层的数值计算当前层的最短路径和即可。
时间复杂度是O(n ^ 2)。空间复杂度是O(n)。
JAVA代码:
public class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
List<Integer> list1 = triangle.get(0);
if(triangle.size() == 1){
int minIndex = 0;
for(int i = 1; i < list1.size(); i++){
if(list1.get(i) < list1.get(minIndex)){
minIndex = i;
}
}
return list1.get(minIndex);
}
List<Integer> list2 = new ArrayList<>();
for(int i = 0; i < triangle.size() - 1; i++){
list2.clear();
list2.add(list1.get(0) + triangle.get(i + 1).get(0));
for(int j = 1; j < triangle.get(i + 1).size() - 1; j++){
list2.add(Math.min(list1.get(j - 1), list1.get(j)) + triangle.get(i + 1).get(j));
}
list2.add(list1.get(list1.size() - 1) + triangle.get(i + 1).get(triangle.get(i + 1).size() - 1));
list1.clear();
list1.addAll(list2);
}
int minIndex = 0;
for(int i = 1; i < list2.size(); i++){
if(list2.get(i) < list2.get(minIndex)){
minIndex = i;
}
}
return list2.get(minIndex);
}
}
LeetCode解题报告: