746. Min Cost Climbing Stairs
题目描述和难度
- 题目描述:
数组的每个索引做为一个阶梯,第 i
个阶梯对应着一个非负数的体力花费值 cost[i]
(索引从0开始)。
每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。
您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。
示例 1:
输入: cost = [10, 15, 20] 输出: 15 解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。
示例 2:
输入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 输出: 6 解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。
注意:
cost
的长度将会在[2, 1000]
。- 每一个
cost[i]
将会是一个Integer类型,范围为[0, 999]
。
- 题目难度:简单。
- 英文网址:746. Min Cost Climbing Stairs 。
- 中文网址:746. 使用最小花费爬楼梯 。
思路分析
求解关键:注意状态的定义。
参考解答
参考解答1:
- 定义状态 dp[i] :第 i 层必须爬,消耗的体力花费最小值。
- 根据状态的定义,要爬到第 len-1 层有两种选择:
- (1)爬到 len-1 层,再上一层到楼顶
- (2)爬到 len-2 层,再上两层到楼顶
public class Solution {
public int minCostClimbingStairs(int[] cost) {
int len = cost.length;
if (len == 0) {
return 0;
}
if (len == 1) {
return cost[0];
}
if (len == 2) {
return Integer.min(cost[0], cost[1]);
}
int[] dp = new int[len];
dp[0] = cost[0];
dp[1] = cost[1];
for (int i = 2; i < len; i++) {
dp[i] = cost[i] + Integer.min(dp[i - 1], dp[i - 2]);
}
return Integer.min(dp[len - 1], dp[len - 2]);
}
public static void main(String[] args) {
int[] cost = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
Solution solution = new Solution();
int minCostClimbingStairs = solution.minCostClimbingStairs(cost);
System.out.println(minCostClimbingStairs);
}
}
参考解答2
/**
* 定义状态与状态转移方程:
* dp[i]:爬到第 i 层(从 0 开始),需要花费的最少体力值
* 需要说明的是:爬到这一层,不消耗这一层的体力值,因为这一层的体力值只表示向上跳要消耗的体力值
* 很容易写出状态转移方程:
* dp[i] = min(cost[i-1] + dp[i-1], cost[i-2] + dp[i-2])
*
* @author liwei
*/
public class Solution2 {
public int minCostClimbingStairs(int[] cost) {
int len = cost.length;
if (len == 0) {
return 0;
}
if (len == 1) {
return cost[0];
}
if (len == 2) {
return Math.min(cost[0], cost[1]);
}
int[] dp = new int[len + 1];
// 注意:跳到第 0 阶和第 1 阶是不用消耗体力值的
// 因为它们都可以作为跳台阶的起点(题目中说:在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。)
dp[0] = 0;
dp[1] = 0;
for (int i = 2; i <= len; i++) {
dp[i] = Math.min(cost[i - 1] + dp[i - 1], cost[i - 2] + dp[i - 2]);
}
return dp[len];
}
}
本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0746-min-cost-climbing-stairs ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com 。