js(105)~746. 使用最小花费爬楼梯-动态规划(dp)

143 阅读1分钟

746. 使用最小花费爬楼梯

image.png 一下方法都是借助动态规划

方法一 不推荐

以下方法,是官方推荐的,但是我不好理解,不推荐

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]);
};