1.题目描述
给定一个整数数组 cost cost ,其中 cost[i] cost[i] 是从楼梯第i i 个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
数据范围:数组长度满足 1≤n≤105 1≤n≤105 ,数组中的值满足 1≤costi≤104 1≤costi≤104
示例1
输入:
[2,5,20]返回值:
5说明:
你将从下标为1的台阶开始,支付5 ,向上爬两个台阶,到达楼梯顶部。总花费为5示例2
输入:
[1,100,1,1,1,90,1,1,80,1]返回值:
6说明:
你将从下标为 0 的台阶开始。 1.支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。 2.支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。 3.支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。 4.支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。 5.支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。 6.支付 1 ,向上爬一个台阶,到达楼梯顶部。 总花费为 6 。
2.解题思路
定义一个dp数组,dp[i]表示爬到第i阶楼梯的最小花费是多少。
那么我们就能得到一个递推公式:dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
因为每一次能爬一个或者两个台阶,所以要上到第i阶楼梯,需要从i-1和i-2这两阶楼梯出发,那么选择哪一个方法呢?就取决于这两种方案中花费代价哪个更小。
直到我们爬上了第n阶楼梯,dp[n]就是我们到达楼梯顶部所需花费的最小代价
3.代码实现
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param cost int整型一维数组
* @return int整型
*/
public int minCostClimbingStairs (int[] cost) {
// write code here
int n = cost.length;
int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 0;
for (int i = 2; i <= n; i++) {
dp[i] = Math.min(dp[i-1] + cost[i-1],dp[i-2] + cost[i-2]);
}
return dp[n];
}
}