【每日一题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 i 层的状态有两种方法:

  1. 从状态 i1 i − 1 走一步到达
  2. 从状态 i2 i − 2 走两步到达

f[i] f [ i ] 表示到第 i i 层的所有方法

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

你会觉得这个方程非常眼熟,它就是著名斐波那契数列表达式,只需再加一个条件 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
知乎关于动态规划的回答

你可能感兴趣的:(Leetcode刷刷刷)