剑指OfferII088.爬楼梯的最少成本

题目

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

剑指OfferII088.爬楼梯的最少成本

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

标签:递归   本题   下标   复杂度   负数   数组   示例   阶梯   楼层   体力   题目   最低   成本   时间   动态   科技   空间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top