题目
数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。
每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬
一个阶梯或者爬两个阶梯。
请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
示例
输入: cost = [10, 15, 20]
输出: 15
解释: 最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。
主要思路
1. 创建一个数组dp,其中dp[i]表示爬到第i个阶梯的最低花费
2. 爬到第i个阶梯可以选择爬一个阶梯或者爬两个阶梯
3. 当选择爬一个阶梯时,就是从第i-1个阶梯向上爬,需要花费dp[i-1]体力值
4. 当选择爬两个阶梯时,就是从第i-2个阶梯向上爬,需要花费dp[i-2]体力值
5. 因为题目要求的是最小花费,所以需要选择dp[i-1]和dp[i-2]中的最小值
6. 最后爬到第i个阶梯还需要花费对应的体力值cost[i]
7. 递推公式为:dp[i] = Math.min(dp[i-1],dp[i-2]) + cost[i]
8. 数组初始化:dp[0] = cost[0] ,dp[1] = cost[1]
9. 数组遍历顺序为从前向后遍历
代码实现
public int minCostClimbingStairs(int[] cost) {
if(cost == null || cost.length == 0){
return 0
}
if(cost.length == 1){
return cost[0]
}
int len = cost.length
int[] dp = new int[len]
dp[0] = cost[0]
dp[1] = cost[1]
for(int i = 2
dp[i] = Math.min(dp[i-1],dp[i-2]) + cost[i]
}
return Math.min(dp[len-1],dp[len-2])
}
参考
代码随想录