写点什么

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

作者:HQ数字卡
  • 2022 年 5 月 19 日
  • 本文字数:763 字

    阅读完需:约 3 分钟

题目描述

数组的每个下标作为一个阶梯,第 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)

  • 坚持算法每日一题,加油!

发布于: 刚刚阅读数: 3
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】爬楼梯的最少成本Java题解_算法_HQ数字卡_InfoQ写作社区