1. 程式人生 > >《劍指offer》---跳臺階問題

《劍指offer》---跳臺階問題

n) 思路 空間限制 python += 8K source 程序 ...

本文算法使用python3實現


1. 問題1

1.1 題目描述:

??一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
??時間限制:1s;空間限制:32768K


1.2 思路描述:

??(1)當 $ n=0 $ 時,返回0
??(2)當 $ n=1 $ 時,只有一種跳法:跳1級臺階。
??(3)當 $ n=2 $ 時,有兩種跳法:(a) 跳1級再跳1級;(b) 直接跳2級。
??(4)當 $ n=3 $ 時,我們只考慮最後一步的情況:(a)當最後一步只跳1級時, $ f(3)=f(3-1) $ ;(b)當最後一步直接跳2級時, $ f(3)=f(3-2) $ 。因此 $ f(3)=f(3-1) + f(3-2) $

??(5)以此類推,當 $ n=N $ 時,只需考慮最後一步的情況即可:(a)當最後一步只跳1級時, $ f(N)=f(N-1) $ ;(b)當最後一步直接跳2級時, $ f(N)=f(N-2) $ 。因此 $ f(N)=f(N-1) + f(N-2) $


1.3 程序代碼:

class Solution:
    # def jumpFloor(self, number):
    #     '''遞歸:提交代碼超時了'''
    #     if number in [0, 1, 2]:
    #       return number
# return self.jumpFloor(number-1)+self.jumpFloor(number-2) def jumpFloor(self, number): '''叠代''' floor = [] for i in range(number+1): if i in [0,1,2]: floor.append(i) continue floor.append(floor[i-1
]+floor[i-2]) return floor[-1]




2. 問題2

2.1 題目描述:

??一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法
??時間限制:1s;空間限制:32768K


2.2 思路描述:

??(1)當 $ n=0 $ 時,返回0
??(2)當 $ n=1 $ 時,只有一種跳法:跳1級臺階。
??(3)當 $ n=2 $ 時,有兩種跳法:(a) 跳1級再跳1級;(b) 直接跳2級。
??(4)當 $ n=3 $ 時,我們只考慮最後一步的情況:(a)當最後一步只跳1級時, $ f(3)=f(3-1) $ ;(b)當最後一步直接跳2級時, $ f(3)=f(3-2) $ ;(c) 當最後一步直接跳3級時, $ f(3) = 1 $ 。因此 $ f(3)=f(3-1) + f(3-2) +1 $
??(5)以此類推,當 $ n=N $ 時,只需考慮最後一步的情況即可:(a)當最後一步只跳1級時, $ f(N)=f(N-1) $ ;(b)當最後一步直接跳2級時, $ f(N)=f(N-2) $ ;(c) 當最後一步直接跳3級時, $ f(N) = f(N-3) $;...;(n)當最後一步直接跳N級時, $ f(N) = 1 $ 。因此 $ f(N) = f(N-1)+f(N-2)+f(N-3)+...+f(1)+1 $


2.3 程序代碼:

class Solution:
    def jumpFloorII(self, number):
        '''叠代法,保存n次結果'''
        floor = []
        for i in range(number+1):
            if i in [0,1,2]:
                floor.append(i)
                continue
            step = 0
            for k in range(i):
                step += floor[k]
            floor.append(step+1)
        return floor[-1]

    # def jumpFloorII(self, number):
    #     '''遞歸法:當number很大時,遞歸很深,會超時'''
    #     if number in [0,1,2]:
    #       return number
    #     res = 0
    #     for k in range(number):
    #       res += self.jumpFloorII(k)
    #     return res+1

《劍指offer》---跳臺階問題