数组的每个下标作为一个阶梯,第 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 。
提示:2 <= cost.length <= 1000
0 <= cost[i] <= 999
注意:本题与主站 746 题相同:
1、动态规划;时间复杂度O(n),空间复杂度O(n)
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
}
2、动态规划;时间复杂度O(n),空间复杂度O(1)
func minCostClimbingStairs(cost []int) int {
a := 0
b := 0
for i := 2; i <= len(cost); i++ {
a, b = b, min(b+cost[i-1], a+cost[i-2])
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
3、递归;时间复杂度O(n),空间复杂度O(n)
var arr []int
func minCostClimbingStairs(cost []int) int {
arr = make([]int, len(cost)+1)
return ClimbingStais(cost, len(cost))
}
func ClimbingStais(cost []int, i int) int {
if i == 0 || i == 1 {
return 0
}
if arr[i] == 0 {
arr[i] = min(ClimbingStais(cost, i-1)+cost[i-1],
ClimbingStais(cost, i-2)+cost[i-2])
}
return arr[i]
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
Easy题目,题目同leetcode 746.使用最小花费爬楼梯
页面更新:2024-05-18
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号