j

jaryue

V1

2023/05/13阅读:11主题:默认主题

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

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


题目描述

  1. 使用最小花费爬楼梯

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

方法1:动态规划
动态规划来计算达到楼梯顶部的最低花费。我们定义一个长度为 n+1 的数组 dp,其中 dp[i] 表示到达第 i 个台阶的最低花费。

我们初始化 dp[0] 和 dp[1] 为 0,因为不需要支付费用来到达这两个台阶。然后,我们从第 2 个台阶开始遍历,对于每个台阶 i,我们有两种选择:

  1. 从第 i-1 个台阶跳上来:此时总花费为 dp[i-1] + cost[i-1]。\
  2. 从第 i-2 个台阶跳上来:此时总花费为 dp[i-2] + cost[i-2]。\

我们选择花费较小的一种方式,更新 dp[i]。最终,dp[n] 就是达到楼梯顶部的最低花费。\

注意,为了方便计算,我们在 cost 数组的前面插入了一个元素为 0 的值,表示初始位置。因此,dp 数组的长度为 n+1。

时间复杂度为 O(n),其中 n 是数组 cost 的长度。这是因为我们需要遍历数组 cost 一次,并计算每个台阶的最低花费。

空间复杂度为 O(n),其中 n 是数组 cost 的长度。我们使用了一个长度为 n+1 的 dp 数组来存储每个台阶的最低花费。

  • 时间复杂度(O(n))
  • 空间复杂度(O(n))

执行结果

法1

func minCostClimbingStairs(cost []int) int {
    n := len(cost)
    dp := make([]int, n+1)
    dp[0] = 0
    dp[1] = 0

    for i := 2; i <= n; i++ {
        dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])
    }

    return dp[n]
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 4 ms , 在所有 Go 提交中击败了 78.60% 的用户 内存消耗: 2.9 MB , 在所有 Go 提交中击败了 10.85% 的用户 通过测试用例: 283 / 283


分类:

后端

标签:

后端

作者介绍

j
jaryue
V1