剑指offer---斐波那数列-和青蛙跳

题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
要求时间限制1秒

思路1–满足时间复杂度 先把n = 0,1,2,这三个项确定了再使用递归
斐波那契数列数列从第3项开始,每一项都等于前两项之和。

例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…
这种方法的原理仍然基于上面的公式,但是用循环代替了递归,比上面的代码效率上有较大的提升,可以

class Solution:
    def Fibonacci(self, n):
        if n == 0:
            return 0
        if n == 1:
            return 1
        if n == 2:
            return 1
        if n > 39:
            return False
        if n >= 3:
            a = 1
            b = 1
            for i in range(n-1):
                a,b = b,a+b  #这个是重点 复杂赋值  这个都没有用到i 是如何确定他会一直走下去的??
            return a

–非递归实现类似思路1

def Fibnacci(n):
    result = [0,1]
    if n <= 1:
        return result[n]
    for i in range(2,n+1):
        result.append(result[i-1]+result[i-2])
    return result[n]

思路2:递归的方法 我们知道 n>2 时 斐波那数列 =f(n-1)+f(n-2)

class Solution():
    def Fibnacci(self,n):
        if n <= 0:
            return 0
        if n == 1:
            return 1
        return self.Fibnacci(n-1) + self.Fibnacci(n-2)

题目8:
拓展题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?

答题思路

如果只有1级台阶,那显然只有一种跳法 如果有2级台阶,那么就有2种跳法,一种是分2次跳。每次跳1级,另一种就是一次跳2级
如果台阶级数大于2,设为n的话,这时我们把n级台阶时的跳法看成n的函数,记为,第一次跳的时候有2种不同的选择:一是第一次跳一级,此时跳法的数目等于后面剩下的n-1级台阶的跳法数目,即为,二是第一次跳二级,此时跳法的数目等于后面剩下的n-2级台阶的跳法数目,即为,因此n级台阶的不同跳法的总数为,不难看出就是斐波那契数列

链接:https://www.jianshu.com/p/965d12083d7f

def Fibnacci(n):
        if n <= 2:
            return n
        result = [0,1, 2]
        for i in range(3, n + 1):
            result.append(result[i - 1] + result[i - 2])
        return result[i]

if __name__=='__main__':
    print(Fibnacci(4))

这个无错误

class Solution:
    def jumpFloor(self, n):
        if n==1 or n==2:
            return n
        a=1;b=2;c=3
        for i in range(3,n+1):
            c=a+b;a=b;b=c
        return c

为什么用第二种方法的数组不行??

拓展:若把条件修改成一次可以跳一级,也可以跳2级…也可以跳上n级呢?
思路

如果台阶级数为n的话,这时我们把n级台阶时的跳法看成n的函数,记为,第一次跳的时候有n种不同的选择:若是第一次跳一级,此时跳法的数目等于后面剩下的n-1级台阶的跳法数目,即为,若是第一次跳m(m<n)级,此时跳法的数目等于后面剩下的n-m级台阶的跳法数目,即为,若是第一次跳n级,此时跳法的数目等于1.所以

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        return 2**(number-1) #直接乘以2
        

题目10描述:
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
解析:

类似于青蛙跳台阶,当n=1时,只有一种横向排列的方式。当n等于二时,22有两种选择,横向或者是竖向。当n等于3的时候对于23来说,如果选择的是竖向排列,则剩下的就是22排列,如果选择的是横向,则对于2n剩下的则只有1*n的一种选择。所以依次类推,找到迭代RectCover(target-1)+RectCover(target-2)。

代码和上面一题一样
    > `def Fibnacci(n):
            if n <= 2:
                return n
            result = [0,1, 2]
            for i in range(3, n + 1):
                result.append(result[i - 1] + result[i - 2])
            return result[i]
    
    if __name__=='__main__':
        print(Fibnacci(4))`

06-斐波那契数列

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。

  • 思路1:非递归实现
    直接按照数列数学公式计算-满足时间复杂度 先把n = 0,1,2,这三个项确定了再使用递归斐波那契数列数列从第3项开始,每一项都等于前两项之和数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 23。。。
class Solution:
    def Fibonacci(self, n):
        if n == 0:
            return 0
        if n == 1:
            return 1
        if n == 2:
            return 1
        if n > 39:
            return False
        if n >= 3:
            a = 1
            b = 1
            for i in range(n-1):
                a,b = b,a+b  #这个是重点 复杂赋值  这个都没有用到i 是如何确定他会一直走下去的??
            return a


```python
# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        result = [0,1]
        if n <= 1:
            return result[n]
        for i in range(2,n+1):
            result.append(result[i-1]+result[i-2])
        return result[n]
  • 方法2–递归实现
class Solution:
    def Fibnacci(self, n):
        if n <= 0:
            return 0
        if n == 1:
            return 1
        return self.Fibnacci(n-1) + self.Fibnacci(n-2)

06-斐波那契数列-拓展1

题目—一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
参考上一题做法

class Solution:
    def jumpFloor(self, n):
        if n <= 2:
            return n
        result = [0,1, 2]
        for i in range(3, n + 1):
            result.append(result[i - 1] + result[i - 2])
        return result[n]

若把条件修改成一次可以跳一级,也可以跳2级…也可以跳上n级呢?
直接是2**(n-1)

06-斐波那契数列-拓展2

题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
和跳台阶的问题一样的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章