跳臺階:
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
import time
class Solution:
def jumpFloor(self, number):
# 遞歸的方法
if number == 1:
return 1
elif number ==2:
return 2
elif number == 3:
return 3
return self.jumpFloor(number-2) + self.jumpFloor(number-1)
def jumpFloor2(self, number):
# 迭代的方法
if number <=2:
return number
pre1 = 2
pre2 = 1
rel = 0
for i in range(3, number+1):
rel = pre1 + pre2
pre2 = pre1
pre1 = rel
return rel
t1 = time.time()
A = Solution()
print(A.jumpFloor(20))
t2 = time.time()
tt1 = t2 - t1
print("遞歸的時間:",tt1)
t3 = time.time()
print(A.jumpFloor2(20))
t4 = time.time()
tt2 = t4 - t3
print("迭代的時間:",tt2)
print("\n速度比值爲:",tt1/tt2)
本質上還是斐波那契數列,所以迭代也可以求
當成 dp 問題來想的話:首先分析問題,它最終解是由前面的解累積起來的解,如何縮小問題的規模?
首先可知,第一階有隻能一步,一種;,第二階可以兩次一步、一次兩步兩種
若樓梯階級 n = 3
跳 2 步到 3:剩下的是第一步沒跳,起始跳到第一步只有一種
跳 1 步到 3:剩下的是第二步沒跳,起始跳到第二步有兩種
通過分類討論,問題規模就減少了:
若樓梯階級 n = n
跳 2 步到 n:剩下的是第 n - 2 步沒跳,起始跳到第 n - 2 步設它爲 pre2 種
跳 1 步到 n:剩下的是第 n - 1 步沒跳,起始跳到第 n - 1 步設它爲 pre1 種
同時可以發現第 n 階的解法,只要用到 n - 1 和 n - 2 階是多少,其他的不用考慮,因此用兩個變量臨時存下來即可
dp(i) = dp(i-2) + dp(i-1)
10946
遞歸的時間: 0.002585172653198242 (不建議)
10946
迭代的時間: 1.2874603271484375e-05
速度比值爲: 200.7962962962963
變態跳臺階:
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
原理:
f(n)=f(n-1)+f(n-2)+……f(1)
f(n-1)=f(n-2)+……f(1)
兩式相減得f(n)=2f(n-1)
class Solution:
def jumpFloorII(self, number):
# write code here
n=1
for i in range(2,number+1):
n=2*n
return n