劍指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的大矩形,總共有多少種方法?
和跳臺階的問題一樣的

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