开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
一、题目描述:
746. 使用最小花费爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)
给你一个整数数组
cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为
0或下标为1的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。
示例 1:
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。
示例 2:
输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。
提示:
- 2 <= cost.length <= 1000
- 0 <= cost[i] <= 999
二、思路分析:
动态规划
由于可以跳1或者2,因此最终的结果要么跳在最后一个台阶上,要么跳过最后一个台阶一个,因此需要考虑跳出最高台阶一个的情况时的花费。 当计算落在原数组长度之外的台阶上时,此时这个台阶没有花费,因此此时无需进行+操作(即i == length时)。
三、AC 代码:
class Solution {
public int minCostClimbingStairs(int[] cost) {
int length = cost.length;
// int[] dp = new int[length + 1];
// dp[0] = cost[0];
// dp[1] = cost[1];
// dp数组可以优化为两个int数字
int dp0 = cost[0];
int dp1 = cost[1];
for (int i = 2; i <= length; i++) {
int tmp = Math.min(dp0, dp1);
dp0 = dp1;
dp1 = (i < length) ? tmp + cost[i] : tmp;
// dp[i] = Math.min(dp[i - 1], dp[i - 2]);
// if (i < length) {
// dp[i] += cost[i];
// }
}
return Math.min(dp0, dp1);
}
}