题目传送:https://leetcode.cn/problems/triangle/
运行效率
第一种写法效率
第二种写法效率
代码如下:
①第一种写法: map+动态规划法
class Solution {
//map当缓存使用,提升查询效率
Map<String, Integer> map = new HashMap<String, Integer>();
public int minimumTotal(List<List<Integer>> triangle) {
int total = Integer.MAX_VALUE;
// 三角形的最后一行
List<Integer> lastRow = triangle.get(triangle.size() - 1);
for (int i = 0; i < lastRow.size(); i++) {
int path = helper(triangle, triangle.size() - 1, i);
total = Math.min(path, total);
}
return total;
}
/*
* @description: 从三角形的某一行的第一个元素开始,计算从三角形的顶点到该元素的最短路径是多少。
* 然后再计算第二个元素,第三个元素,直到把该行的所有元素都计算一遍,取最小路径
* @date: 2022/8/29 19:21
* @param row 当前行索引
* @param i 当前行的 i索引位置
* @return: 最短路径
*/
public int helper(List<List<Integer>> triangle, int row, int i) {
// 处理边界情况
if (row == 0) {
return triangle.get(0).get(0);
}
// 上一行
List<Integer> preRow = triangle.get(row - 1);
// 当前行
List<Integer> curRow = triangle.get(row);
// 当前行第i个位置的元素值
Integer curVal = curRow.get(i);
if (row == 1) {
return preRow.get(0) + curVal;
}
// 递归计算上一行的第i-1个元素和第i个元素的最短路径
int path1 = Integer.MAX_VALUE;
int path2 = Integer.MAX_VALUE;
if (i - 1 >= 0) {
String key = (row - 1) + ":" + (i - 1);
if (map.containsKey(key)) {
path1 = map.get(key);
} else {
path1 = helper(triangle, row - 1, i - 1);
map.put(key, path1);
}
}
if (i < preRow.size()) {
String key = (row - 1) + ":" + i;
if (map.containsKey(key)) {
path2 = map.get(key);
} else {
path2 = helper(triangle, row - 1, i);
map.put(key, path2);
}
}
return Math.min(path1, path2) + curVal;
}
}
②第二种写法 动态规划法
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int total = Integer.MAX_VALUE;
//三角形最后一行的元素个数
int size = triangle.get(triangle.size() - 1).size();
//处理边界情况
if(triangle.size()==1){
return triangle.get(0).get(0);
}
int[][] dp = new int[size][size];
// 初始化dp[0][0]
dp[0][0] = triangle.get(0).get(0);
for (int row = 1; row < triangle.size(); row++) {
for (int i = 0; i < triangle.get(row).size(); i++) {
// 当前行
List<Integer> curRow = triangle.get(row);
// 当前行第i个位置的元素值
Integer curVal = curRow.get(i);
int path1 = Integer.MAX_VALUE;
int path2 = Integer.MAX_VALUE;
if (i <= triangle.get(row - 1).size() - 1) {
path1 = dp[row - 1][i];
}
if (i - 1 >= 0) {
path2 = dp[row - 1][i - 1];
}
dp[row][i] = Math.min(path1, path2) + curVal;
if (row == triangle.size() - 1) {
total = Math.min(total, dp[row][i]);
}
}
}
return total;
}
}