[剑指offer]10.斐波那契数列+青蛙跳台阶问题

Posted wyz-2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[剑指offer]10.斐波那契数列+青蛙跳台阶问题相关的知识,希望对你有一定的参考价值。

10- I. 斐波那契数列

方法一 Top-down

技术图片

用递归实现

def fibonacci(n):
    if n <= 0:
        return 0 
    if n == 1:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)

不过这种方法在leetcode上超时了。

方法二 Bottom-up

用循环实现

class Solution:
    def fib(self, n: int) -> int:
        if n <= 0:
            return 0
        if n == 1:
            return 1
        tmp = 0
        fibNMinusOne = 1
        fibNMinusTwo = 0
        for i in range(2, n+1):
            tmp = fibNMinusOne + fibNMinusTwo
            fibNMinusTwo = fibNMinusOne
            fibNMinusOne = tmp
        return tmp

面试题10- II. 青蛙跳台阶问题

思路:把它转化为一个Fibonacci问题。

设青蛙跳n级台阶,共numWays(n)种方法;

如果青蛙第一次跳一级台阶,则剩下的n-1级台阶共numWays(n-1)种跳法;

如果青蛙第一次跳两级台阶,剩下的n-2级台阶共numWays(n-2)种跳法;

故numWays(n) = numWays(n-2) + numWays(n-1),即为递推公式。

代码

class Solution:
    def numWays(self, n: int) -> int:
        res = [1, 1, 2]
        if n <= 2:
            return res[n]
        fibN = 0
        fibNMinusTwo = 1
        fibNMinusOne = 2
        for i in range(3, n+1):
            fibN = fibNMinusOne + fibNMinusTwo
            fibNMinusTwo = fibNMinusOne
            fibNMinusOne = fibN
        return fibN%1000000007

以上是关于[剑指offer]10.斐波那契数列+青蛙跳台阶问题的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-斐波那契数列

代码随想录算法训练营day46|139.单词拆分 剑指Offer10-I.斐波那契数列 10-II.青蛙跳台阶问题

剑指offer(10)—— 斐波那契数列以及跳台阶问题

剑指Offer:面试题10-II.青蛙跳台阶问题

java刷题--剑指offer 10 斐波那契数列

斐波那契数列(C++ 和 Python 实现)