leetcode-70 爬楼梯

假设你正在爬楼梯。需要 n 步你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 步 + 1 步
2.  2 步

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 步 + 1 步 + 1 步
2.  1 步 + 2 步
3.  2 步 + 1 步

思路:

假设f(n)为在第n阶台阶的情况下,所有不同的跳法方法的总和!
1.如果在n-1阶下跳一格,那么有 f(n-1) 种跳法;
2.如果在n-2阶下跳两格,那么有 f(n-2) 种跳法;
因此f(n) = f(n-1) + f(n-2),实际结果即为斐波纳契数。

代码:

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 0: return 1
        if n == 1: return 1
        
        tmpList = [1,1]
        for i in range(0,n-1):
            x = tmpList[-1] + tmpList[-2]
            tmpList.append(x)
        # print tmpList
        return tmpList[-1]

拓展:

如果你可以一次性跳1~n阶,那么跳完n阶台阶有多少种跳法?

设f(n)为n阶台阶的情况下,所有不同的跳法方法的总和!
1.如果在n-1阶跳一阶,那么就有 f(n-1) 种跳法;
2.如果在n-2阶跳二阶,那么就有 f(n-2) 种跳法;
3.如果在n-3阶跳一阶,那么就有 f(n-3) 种跳法;
...
n.如果在n-n阶跳一阶,那么就有 f(n-n) 种跳法;

假定f(0) = 1,已知一阶台阶时,跳法只有一种,所以f(1) = 1,所以f(2) = 1+1 = 2
得:  f(n) = f(n-1)+f(n-2)+f(n-3)...+...+f(n-(n-1))+f(n-n)
       f(n) = f(n-1)+f(n-2)+f(n-3)+...+f(0)

又:  f(n-1) = f(n-2)+f(n-3)...+...+f(0)
    f(n-2) = f(n-3)+f(n-4)...+...+f(0)

则:  f(n) = 2 * f(n-1)
       = 2^2 * f(n-2)
       = 2^(n-2) * f(2) 

最终结果f(n) = 2**(n-1) 

猜你喜欢

转载自blog.csdn.net/u012474535/article/details/80174594