【每日一题leetcode】70 Climbing Stairs

这道题花了蛮久时间,刚开始接触DP,需要多一些思维训练。
题目:
**You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?**
Note: Given n will be a positive integer.

  1. Example 1: Input: 2 Output: 2 Explanation: There are two ways to
    climb to the top.

    1. 1 step + 1 step
    2. 2 steps
  2. Example 2: Input: 3 Output: 3 Explanation: There are three ways to
    climb to the top.

    1. 1 step + 1 step + 1 step
    2. 1 step + 2 steps
    3. 2 steps + 1 step

本题的Solution有提供非常详细的分析说明,可以参考下面提供的地址。
这里使用DP的方法,将问题分解为子问题。
状态定义
i i 表示到梯子的第i层,到达第 i i 层的状态有两种方法:

  1. 从状态 i1走一步到达

    • 从状态 i2 i − 2 走两步到达
    • f[i] f [ i ] 表示到第 i i 层的所有方法

      状态转移方程:
      f[i]=f[i1]+f[i2]

      你会觉得这个方程非常眼熟,它就是著名斐波那契数列表达式,只需再加一个条件 i>=2 i >= 2 。只是在这个题目中起始的两个数是 [1,2] [ 1 , 2 ] 而不是 [1,1] [ 1 , 1 ]

      代码如下:

      class Solution:
          def climbStairs(self, n):
              """
              :type n: int
              :rtype: int
              """
      
              if n == 0 or n==1 or n==2:
                  return n
      
              # f[i] = f[i-1] + f[i-2] ; f[1]=1,f[2]=2
              f = list(range(n+1))
              f[1]=1
              f[2]=2
              for i in range(3,n+1):
                  f[i] = f[i-1] + f[i-2]
      
      
              return f[n]

      参考链接:
      Leetcode Solution
      知乎关于动态规划的回答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值