leetcode
leetcode 3051 ~ 3100
三角形最小路径和

三角形最小路径和

难度:

标签:

题目描述

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]`的理由是什么?
初始化`dp[0][0]`为`triangle[0][0]`是因为在动态规划中,我们需要一个起始条件来推导后续的状态。在这个问题中,`dp[0][0]`表示从三角形顶点到达顶点自己的最小路径和。因为顶点到顶点的路径只包含顶点本身,所以最小路径和就是顶点的值,即`triangle[0][0]`。这个初始化是整个状态转移的基础,确保了计算的正确开始。
🦆
如何处理三角形的每一行的左右边界情况,具体的状态转移方程是什么?
在处理三角形的每一行时,左右边界情况需要特殊处理,因为边界位置只有一种路径选择。对于左边界(即列索引 j=0 的位置),状态转移方程是 `dp[i][0] = dp[i-1][0] + triangle[i][0]`,意味着当前位置的最小路径和只能从上一行同列的位置转移而来,加上当前行的值。对于右边界(即列索引 j=i 的位置,i 表示行索引),状态转移方程是 `dp[i][i] = dp[i-1][i-1] + triangle[i][i]`,意味着当前位置的最小路径和只能从上一行的前一列转移而来,加上当前行的值。这两个方程确保了动态规划在处理边界时的正确性和完整性。

相关问题