题目描述
给你一个整数数组 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 。
思路分析
通过对题目进行分析我们可以发现,当前的消费都由它下面的消费所决定,我们可以把这个理解为状态
比如第n层的消费,可能会由它之前的两个决定,可能是倒数前一个,或是倒数第二个所决定。
所以就可以推导出dp[i] = Math.min(dp[i-1] + dp[i-2]) + cost[i]
代码示例
/**
* @param {number[]} cost
* @return {number}
*/
// 方法一:
// var minCostClimbingStairs = function(cost) {
// let len = cost.length;
// let arr = [];
// arr[0] = cost[0];
// arr[1] = cost[1];
// for(let i = 2; i < len; i++) {
// arr[i] = Math.min(arr[i-1] , arr[i-2]) + cost[i]
// }
// return Math.min(arr[len-1], arr[len-2]);
// };
// 方法二:
var minCostClimbingStairs = function(cost) {
let len = cost.length
let dp1 =cost[0],
dp2 =cost[1]
for(let i = 2;i<cost.length;i++) {
let dpTmp= Math.min(dp1,dp2) + cost[i]
dp1 = dp2
dp2 = dpTmp
}
return Math.min(dp1,dp2)
};
标签:下标,arr,台阶,746,花费,上爬,cost,let,爬楼梯
From: https://www.cnblogs.com/zx529/p/16838379.html