题目:
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
来源:力扣(LeetCode)
思路:
1)注意代码的细节:需要写清楚
2)dp数组代表的是各个位置处,花费的体力的最小值;
主要是下标对应关系的处理!
dp下标 i处,对应的是站在i级台阶上的最小花费;
cost的最后一个值,是从n-1到n的花费;dp最后一个是站在n处的最小花费!
3)和前面题目类似,n级台阶处只能由n - 1和n - 2台阶处到达!
4)大多数DP的题都可以进行空间复杂度的优化,但是不优化也可以;要区分什么情况下更好理解!
代码:
1)原始手写DP
class Solution {
//本题就是状态转移
public int minCostClimbingStairs(int[] cost) {
//要越过 数组的最后一个,才是到达了楼梯的顶!
int n = cost.length;
int[] dp = new int[n];//创建dp数组
//dp数组中保存的是 最少的花费
dp[0] = 0;//表示站在1台阶上,最小花费!
dp[1] = Math.min(dp[0] + cost[1],cost[0]);//站在二台阶上,最小花费;可能是先到1再从一跳到2;也可能是从0出发直接到2
for(int i = 2;i < n;i++){
dp[i] = Math.min((dp[i - 1] + cost[i]),(dp[i - 2] + cost[i - 1]));//得到更少的花费
}
return dp[n - 1];
}
}
2)优化:降低空间复杂度
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n = cost.length;
int dp0 = 0;
int dp1 = Math.min(dp0 + cost[1],cost[0]);//站在二台阶上,最小花费;可能是先到1再从一跳到2;也可能是从0出发直接到2
int sum = 0;
//模仿前两道的优化方式
for(int i = 2;i < n;i++){
sum = Math.min((dp1 + cost[i]),(dp0 + cost[i - 1]));//得到更少的花费
dp0 = dp1;
dp1 = sum;
}
if(n == 2) return Math.min(cost[0],cost[1]);
return sum;
}
}