jaryue
2023/05/13阅读:11主题:默认主题
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
方法1:动态规划
动态规划来计算达到楼梯顶部的最低花费。我们定义一个长度为 n+1 的数组 dp,其中 dp[i] 表示到达第 i 个台阶的最低花费。
我们初始化 dp[0] 和 dp[1] 为 0,因为不需要支付费用来到达这两个台阶。然后,我们从第 2 个台阶开始遍历,对于每个台阶 i,我们有两种选择:
-
从第 i-1 个台阶跳上来:此时总花费为 dp[i-1] + cost[i-1]。\ -
从第 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
作者介绍