使用最小花费爬楼梯
难度:
标签:
题目描述
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],而没有考虑其他可能的步数?
▷🦆
在题解中,变量a和b被初始化为0,这是否意味着初始位置的成本被忽略了?如果是这样,如何解释初始位置不需要成本的逻辑?
▷🦆
题解中的动态规划算法迭代到cost数组长度加一,即len(cost)+1,这是否意味着在数组外创建了一个虚拟的终结点来计算总花费?
▷