leetcode
leetcode 2901 ~ 2950
使用最小花费爬楼梯

使用最小花费爬楼梯

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 22 ms, 内存: 16.1 MB


/*
 * 题目思路:
 * 1. 使用Java Stream API来简化代码
 * 2. 动态规划思路保持不变
 * 3. 使用IntStream生成dp数组
 */
import java.util.stream.IntStream;

public class MinCostClimbingStairsStream {
    public int minCostClimbingStairs(int[] cost) {
        int n = cost.length;
        int[] dp = new int[n];
        dp[0] = cost[0];
        dp[1] = cost[1];
        IntStream.range(2, n).forEach(i -> dp[i] = cost[i] + Math.min(dp[i - 1], dp[i - 2]));
        return Math.min(dp[n - 1], dp[n - 2]);
    }
}

解释

方法:

这个题解采用了动态规划的方法。定义两个变量a和b来存储到达每一步时的最小花费。变量a存储到达前一个阶梯的最小花费,变量b存储到达当前阶梯的最小花费。对于每一个阶梯i,可以从i-1或i-2阶梯到达,因此到达i阶梯的最小花费可以从这两种情况中取较小值,即c = min(a + cost[i-2], b + cost[i-1])。然后更新变量a和b的值为下一轮的前两个花费,即a = b和b = c。这样,当迭代完成后,b存储的就是达到楼顶的最小花费。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
题解中提到可以从i-1或i-2阶梯到达i阶梯,为什么在动态规划的状态转移方程中只考虑了cost[i-1]和cost[i-2],而没有考虑其他可能的步数?
这是因为题目规定了每次只能爬一阶或两阶楼梯,所以从i-1或i-2到达i是唯一可能的两种方式。如果考虑从其他步数到达i,那将违反题目的基本规定,导致解法不适用。动态规划的设计需要严格根据问题的约束来设定状态转移方程。
🦆
在题解中,变量a和b被初始化为0,这是否意味着初始位置的成本被忽略了?如果是这样,如何解释初始位置不需要成本的逻辑?
变量a和b初始化为0的原因在于题目允许从第0级或第1级阶梯开始爬楼梯,且不需要支付这两个阶梯的成本作为初始条件。这样,a和b作为动态规划中的初始状态,对应于达到这两个阶梯的累计最小花费(在开始爬楼梯前没有花费)。这是一个典型的边界条件设置,确保了无论从哪一步开始,算法都能正确计算出从起点开始的最低成本。
🦆
题解中的动态规划算法迭代到cost数组长度加一,即len(cost)+1,这是否意味着在数组外创建了一个虚拟的终结点来计算总花费?
确实如此。在迭代到len(cost)+1时,实际上考虑的是到达楼梯顶端之后的虚拟位置。这种设计允许算法计算在最后一步完全踏上楼顶需要的最小花费。因为可以从最后一个或倒数第二个阶梯一步到达楼顶,所以需要将迭代延伸到cost数组长度之外,以便涵盖所有可能的最终步骤。

相关问题