746. 使用最小花费爬楼梯
题目:数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。
解法:动态规划
思路:数学符号:dp[i]表示到达第i阶楼梯需要的最小时间代价(需算上第i的时间花费);状态转移方程:dp[i] = Math.min(dp[i-1],dp[i-2])+cost[i];答案就是Math.min(dp[len-1],dp[len-2]);
代码:
class Solution {
public int minCostClimbingStairs(int[] cost) {
int len = cost.length;
if(len==2){
return Math.min(cost[0],cost[1]);
}
int[] dp = new int[len]; //表示到达第i阶楼梯需要的最小时间代价(需算上第i的时间花费)
dp[0] = cost[0];
dp[1] = cost[1];
for(int i=2;i<len;i++){
dp[i] = Math.min(dp[i-1],dp[i-2])+cost[i];
}
return Math.min(dp[len-1],dp[len-2]);
}
}
优化空间复杂度:
class Solution {
public int minCostClimbingStairs(int[] cost) {
int len = cost.length;
if(len==2){
return Math.min(cost[0],cost[1]);
}
int[] dp = new int[len]; //表示到达i需要的最小时间代价(需算上第i的时间花费)
int a = cost[0];
int b = cost[1];
for(int i=2;i<len;i++){
int c = Math.min(a,b)+cost[i];
a=b;
b=c;
}
return Math.min(a,b);
}
}

浙公网安备 33010602011771号