题目

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例 1:

  1. 输入:cost = [10,15,20]
  2. 输出:15
  3. 解释:你将从下标为 1 的台阶开始。
  4. - 支付 15 ,向上爬两个台阶,到达楼梯顶部。
  5. 总花费为 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

    解题方法

    动态规划

    设置动态数组dp[i]表示到达第i个台阶所需要花费的最小代价,需要注意的是,题目要求到达台阶顶,及下标为cost.size()的地方。具体递推关系以及初始化关系如下:
    746. 使用最小花费爬楼梯 - 图1
    时间复杂度O(n),空间复杂度O(1)
    C++代码:

    class Solution {
    public:
      int minCostClimbingStairs(vector<int>& cost) {
          if(cost.size()<2)   return 0;
          int cur = 0;
          int pre = 0;
          for(int i=2; i<=cost.size(); i++) {
              int tmp = cur;
              cur = min(pre+cost[i-2], cur+cost[i-1]);
              pre = tmp;
          }
    
          return cur;
      }
    };