题目
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
- 来源:力扣(LeetCode)
- 链接:leetcode-cn.com/problems/mi…
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法
思路
直接使用动态规划。
记dp[i]表示达到台阶i的最小花费。
那么到达i可以通过i-1或者i-2到达,选择两个的最小值就可以。
注意:
- dp[0] = dp[1]=0。因为可以直接从第0阶或者第1阶开始跳,成本为0。
- dp[n-1]不是楼顶,dp[n]才是
代码
public int minCostClimbingStairs(int[] cost) {
// dp[i]表示爬到第i个台阶的最小花费
// dp[i-1]或者dp[i-2]
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-2] + cost[i-2], dp[i-1] + cost[i-1]);
}
return dp[n];
}
复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(n)
解法二
思路
上面的空间复杂度太高了。
代码
public int minCostClimbingStairs(int[] cost) {
// dp[i]表示爬到第i个台阶的最小花费
// dp[i-1]或者dp[i-2]
int n = cost.length;
int a = 0;
int b = 0;
for (int i = 2; i <= n; i++) {
int temp = b;
b = Math.min(a + cost[i-2], b + cost[i-1]);
a = temp;
}
return b;
}
复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)