746. 使用最小花费爬楼梯 [简单]

212 阅读1分钟

题目

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