您现在的位置是:首页 >技术教程 >leetcode 746. 使用最小花费爬楼梯网站首页技术教程

leetcode 746. 使用最小花费爬楼梯

富有一文 2024-06-17 10:25:04
简介leetcode 746. 使用最小花费爬楼梯

题目详情

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

动态规划之带备忘录实现

动态规划五步走解题:动态规划理论基础

1、确定dp数组以及下标的含义
dp[i]的定义为:爬到第i个台阶需要的最小代价

2、确定递推公式
爬到第i个台阶需要的花费可以是两种情况:1、爬到第i-1个台阶需要的花费 + cost[i-1];2、爬到第i-2个台阶需要的花费 + cost[i-2]
为了使得最后的代价最小,因此dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);

3、dp数组如何初始化
由于题目给出,可以选择从第0个台阶开始或者第1个台阶开始,因此如下初始化:
dp[0] = 0,dp[1] = 1

4、确定遍历顺序
dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的

5、举例推导dp数组
按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],当cost数组为cost = [1,100,1,1,1,100,1,1,100,1]的时候,dp数组应该是如下的数列:
0 0 1 2 2 3 3 4 4 5 6

Java完整代码

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int length = cost.length;
        // 到达第i台阶所花费的最少体力为dp[i]
        int [] dp = new int[length + 1];  // 一共的台阶数为 cost.length + 1
        // 边界不用考虑 2 <= cost.length <= 1000
        // 初始化
        dp[0] = 0;
        dp[1] = 0;

        for (int i = 2; i < length + 1; i++) {
            dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
        }
        return dp[length];
    }
}

ps:计划每日更新一篇博客,今日2023-05-16,日更第三十天。
昨日更新:

leetcode 70. 爬楼梯

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。