经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
746. Min Cost Climbing Stairs
来源:cnblogs  作者:PilgrimHui  时间:2018/10/8 8:49:53  对本文有异议

问题

在一个楼梯上,cost[i]表示第i个梯子的代价,只要你付出这个代价就可以爬一步或两步,你可以从index 0开始或者index 1开始爬。求爬到顶部(cost的index从0到n-1,要爬到index n的梯子上)的最小代价。cost的长度至少为2。

Input: cost = [10, 15, 20]
Output: 15
Input: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
Output: 6

思路

做法1:dp[i]表示到达i个阶梯需要付出的最小代价,因为可以跳一步或两步,dp[i]可以表示为前一个阶梯跳过来和前两个阶梯跳过来花费的代价的最小值,dp公式为:\(dp[i] = min(dp[i-1]+cos[i-1], dp[i-2]+cost[i-2])\)

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

做法2:考虑到每次dp的值dp[i]只取决于前面两个值dp[i-1]和dp[i-2],可以使用两个临时变量f1和f2来代替,这样可以省下dp数组的空间开销。

时间复杂度O(n),空间复杂度O(1)

代码

做法1

  1. class Solution(object):
  2. def minCostClimbingStairs(self, cost):
  3. """
  4. :type cost: List[int]
  5. :rtype: int
  6. """
  7. dp = [0] * (len(cost)+1)
  8. for i in range(2,len(cost)+1):
  9. dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])
  10. return dp[len(cost)]

做法2

  1. class Solution(object):
  2. def minCostClimbingStairs(self, cost):
  3. """
  4. :type cost: List[int]
  5. :rtype: int
  6. """
  7. f1 = f2 = 0
  8. for i in range(2,len(cost)+1):
  9. f1, f2 = min(f1+cost[i-1], f2+cost[i-2]), f1
  10. return f1
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号