【LeetCode】爬楼梯的最少成本Java题解

115 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第35天,点击查看活动详情

题目描述

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。

每当爬上一个阶梯都要花费对应的体力值,一旦支付了相应的体力值,就可以选择向上爬一个阶梯或者爬两个阶梯。

请找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。

示例 1:

输入:cost = [10, 15, 20]
输出:15
解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。

 示例 2:

输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出:6
解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/GzCJIP
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是数组相关的题目,题目要求求出爬楼梯的最小成本。爬楼梯这个题目很熟悉,每次可以向上爬一个阶梯或者爬两个阶梯。这个题目有多种解法,我们采用动态规划求解。
  • 数组 cost 的长度是n, 下标是0 ~ n - 1, 我们首先创建一个长度为 n + 1 的 dp数组,由于你可以选择从下标为 0 或 1 的元素作为初始阶梯。因此 dp[0] = dp[1] = 0, 求最小花费,递推公式为 dp[i] = Math.min(dp[i-1] + cost[i - 1] , dp[i-2] + cost[i - 2]); 实现代码如下,供参考。

通过代码

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int n = cost.length;
        int[] dp = new int[n + 1];
        dp[0] = dp[1] = 0;
        for(int i = 2; i <= n ; i++){
            dp[i] = Math.min(dp[i-1] + cost[i - 1] , dp[i-2] + cost[i - 2]);
        }
        return dp[n];
    }
}

总结

  • 上述算法的时间复杂度是O(n), 空间复杂度是O(n)
  • 坚持算法每日一题,加油!