三角形最小路径和
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 24 ms, 内存: 17.6 MB
/*
* 题目思路:
* 1. 使用Java Stream API从底部向上计算每一行的最小路径和。
* 2. 每一个元素的最小路径和等于其自身加上其下一行的相邻两个元素中的较小值。
* 3. 最终,顶层元素的值即为所求的最小路径和。
*/
import java.util.List;
import java.util.stream.IntStream;
public class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
// 从倒数第二行开始,向上逐行计算
IntStream.range(0, triangle.size() - 1).mapToObj(i -> triangle.size() - 2 - i).forEach(i -> {
IntStream.range(0, triangle.get(i).size()).forEach(j -> {
int minPathSum = Math.min(triangle.get(i + 1).get(j), triangle.get(i + 1).get(j + 1));
triangle.get(i).set(j, triangle.get(i).get(j) + minPathSum);
});
});
// 顶层元素的值即为所求的最小路径和
return triangle.get(0).get(0);
}
}
解释
方法:
此题解使用动态规划来解决三角形最小路径和的问题。我们定义一个二维数组 dp,其中 dp[i][j] 表示从顶部到达第 i 行第 j 列位置的最小路径和。初始化 dp[0][0] 为 triangle[0][0],即顶点值。对于每一行,处理两个边界情况:dp[i][0] 只能从 dp[i-1][0] 转移而来,dp[i][i] 只能从 dp[i-1][i-1] 转移而来。对于非边界位置 j (1 <= j < i),dp[i][j] 可以从 dp[i-1][j] 或 dp[i-1][j-1] 转移而来,取二者的最小值再加上当前位置的值 triangle[i][j]。最终,最后一行的最小值即为整个三角形的最小路径和。
时间复杂度:
O(n^2)
空间复杂度:
O(n^2)
代码细节讲解
🦆
在动态规划解法中,为什么选择从上到下而不是从下到上计算路径和?
▷🦆
解题中初始化`dp[0][0]`为`triangle[0][0]`的理由是什么?
▷🦆
如何处理三角形的每一行的左右边界情况,具体的状态转移方程是什么?
▷