您现在的位置是:首页 >技术教程 >leetcode 746. 使用最小花费爬楼梯网站首页技术教程
leetcode 746. 使用最小花费爬楼梯
题目详情
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
示例 1:
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。
示例 2:
输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。
提示:
2 <= cost.length <= 1000
0 <= cost[i] <= 999
动态规划之带备忘录实现
动态规划五步走解题:动态规划理论基础
1、确定dp数组以及下标的含义
dp[i]的定义为:爬到第i个台阶需要的最小代价
2、确定递推公式
爬到第i个台阶需要的花费可以是两种情况:1、爬到第i-1个台阶需要的花费 + cost[i-1];2、爬到第i-2个台阶需要的花费 + cost[i-2]
为了使得最后的代价最小,因此dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
3、dp数组如何初始化
由于题目给出,可以选择从第0个台阶开始或者第1个台阶开始,因此如下初始化:
dp[0] = 0,dp[1] = 1
4、确定遍历顺序
dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
5、举例推导dp数组
按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],当cost数组为cost = [1,100,1,1,1,100,1,1,100,1]的时候,dp数组应该是如下的数列:
0 0 1 2 2 3 3 4 4 5 6
Java完整代码
class Solution {
public int minCostClimbingStairs(int[] cost) {
int length = cost.length;
// 到达第i台阶所花费的最少体力为dp[i]
int [] dp = new int[length + 1]; // 一共的台阶数为 cost.length + 1
// 边界不用考虑 2 <= cost.length <= 1000
// 初始化
dp[0] = 0;
dp[1] = 0;
for (int i = 2; i < length + 1; i++) {
dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
}
return dp[length];
}
}
ps:计划每日更新一篇博客,今日2023-05-16,日更第三十天。
昨日更新:
leetcode 70. 爬楼梯