我永远只会弄出转移方程就不管了
class Solution {
public int minCostClimbingStairs(int[] cost) {
//分为两种情况
//最后一步踏1阶和踏2阶
//假设前方已到达最小花费
//dp[i-1]+cost[i]
//dp[i-2]+cost[i-1]
//dp[i]是踏到第i个阶梯的最小花费
int dp[]=new int[cost.length];
dp[0]=0;
dp[1]=Math.min(cost[0],cost[1]); //两种情况 从第0级台阶跨两步走过1 ;踏上第1级台阶为开始
for(int i=2;i<cost.length;i++){
dp[i]=Math.min(dp[i-1]+cost[i],dp[i-2]+cost[i-1]);
}
return dp[cost.length-1];
}
}
看了一位大佬的解题,可以减少内存的消耗,降低空间复杂度
不去存dp数组,直接用几个数进行不断地代替
//内存优化
class Solution {
public int minCostClimbingStairs(int[] cost) {
int minCost0 = 0; //不断代替 就是上面的dp[0]
int minCost1 = Math.min(cost[0], cost[1]); //dp[1]
int minCost = 0; //最终结果
for (int i = 2; i < cost.length; i++) {
minCost = Math.min(minCost1 + cost[i], minCost0 + cost[i - 1]);
//往后计算的时候,每一个都要往后推
minCost0 = minCost1; //比如 dp[1]赋值给dp[0]
minCost1 = minCost; //dp[2]赋值给dp[1] 这样根据公式就可以继续推出dp[3], 即新的mincost
}
return minCost;
}
}