LeetCode 0746. 使用最小花费爬楼梯:动态规划(原地)——不用什么从递归到递推

【LetMeFly】746.使用最小花费爬楼梯:动态规划(原地)——不用什么从递归到递推

力扣题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/

给你一个整数数组 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

方法一:动态规划(原地)

这道题不用什么“一步步教你从递归到递推”,这道题本身不难,直接从递归的角度考虑就行。

对于台阶 i i i,我从 i − 1 i-1 i1来合适还是从 i − 2 i-2 i2来合适呢?当然是哪个花费小从哪个来。因此就有了所谓的“动态规划转移方程”:

c o s t [ i ] + = m i n ( c o s t [ i − 1 ] , c o s t [ i − 2 ] ) cost[i] += min(cost[i - 1], cost[i - 2]) cost[i]+=min(cost[i1],cost[i2])

注意本题“顶部”的费用没给,因此视为 0 0 0即可。问题解决了。

  • 时间复杂度 O ( l e n ( c o s t s ) ) O(len(costs)) O(len(costs))
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        cost.push_back(0);
        for (int i = 2; i < cost.size(); i++) {
            cost[i] += min(cost[i - 1], cost[i - 2]);
        }
        return cost.back();
    }
};
Python
# from typing import List

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        cost.append(0)
        for i in range(2, len(cost)):
            cost[i] += min(cost[i - 1], cost[i - 2])
        return cost[-1]

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/135046961

你可能感兴趣的:(题解,#,力扣LeetCode,leetcode,动态规划,算法,题解,DP)