746. 使用最小花费爬楼梯
一下方法都是借助动态规划
方法一 不推荐
以下方法,是官方推荐的,但是我不好理解,不推荐
var minCostClimbingStairs = function(cost) {
const n = cost.length;
const dp = new Array(n+1);
dp[0]=dp[1]=0;
for(let i = 2; i<= n; i++){
// 但从这一个 主要步骤来理解,就是 第i层 需要对比 是通过第i-1和i-2哪一层到达目标话费最少,因为第i-1和i-2分别对应花费是cost[i-1]和cost[i-2]
dp[i] = Math.min(dp[i-1]+cost[i-1], dp[i-2] + cost[i-2]);
}
return dp[n];
};
方法二
2.1和2.2的核心方法一样都是 dp[i] = Math.min(dp[i-1], dp[i-2]) + cost[i],但是处理过程不一样
2.1
var minCostClimbingStairs = function(cost) {
const dp = [cost[0], cost[1]];
for(let i = 2; i <= cost.length; i ++ ) {
dp[i] = Math.min(dp[i-1], dp[i-2]) + cost[i]
}
return Math.min(dp[cost.length-1], dp[cost.length-2])
};
2.2
var minCostClimbingStairs = function(cost) {
const dp = new Array(cost.length + 1).fill(0);
// 因为dp比原来cost数组多一个 所以cost需要不全
cost.push(0);
// 对dp第一个和第二个元素 赋初始值
dp[0] = cost[0], dp[1] = cost[1];
for(let i = 2; i <= cost.length; i ++ ) {
dp[i] = Math.min(dp[i-1], dp[i-2]) + cost[i]
}
// 因为dp比原cost数组多1 所以 需要-1
return dp[cost.length - 1]
};
方法三
var minCostClimbingStairs = function(cost) {
const costLen = cost.length;
for (let i = 2; i < costLen; i++) {
cost[i] += Math.min(cost[i - 1], cost[i - 2]);
}
return Math.min(cost[costLen - 1], cost[costLen - 2]);
};