动态规划
import java.util.List;
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
/**
* 逆向思维
* 从下往上寻找最小路径,路径的条数越来越少,更容易找到
* 假设最后一行下面还有一行,其值都为0,这样最后一行不用单独考虑
* 首先从最下面一行出发,每个点初始路径大小就是本身
* dp[i][j]定义为从最后一行往上到[i, j]这个点,经过的位置的最小和,即dp[i + 1][j]和dp[i + 1][j + 1]二者取最小值
*/
int[][] dp = new int[triangle.size() + 1][triangle.size() + 1];
for (int i = triangle.size() - 1; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
dp[i][j] = Math.min(dp[i + 1][j], dp[i + 1][j + 1]) + triangle.get(i).get(j);
}
}
/**
* 循环结束后第一个点存储的就是所有路径中最短的那条
*/
return dp[0][0];
}
}
/**
* 时间复杂度 O(n^2)
* 空间复杂度 O(n^2)
*/
优化1——空间优化
import java.util.List;
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
/**
* 每次从下往上找的过程中,只有当前行的结果会发生变化,已经遍历过的行不会再使用,因此可以使用一个一维数组循环覆盖
* dp[j]定义为当前行正在变化的位置,比较的dp[j]和dp[j + 1]其实是下一行纵坐标相同的值
*/
int[] dp = new int[triangle.size() + 1];
for (int i = triangle.size() - 1; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
dp[j] = Math.min(dp[j], dp[j + 1]) + triangle.get(i).get(j);
}
}
return dp[0];
}
}
/**
* 时间复杂度 O(n^2)
* 空间复杂度 O(n)
*/
https://leetcode-cn.com/problems/triangle/