《劍指offer》 跳台階問題

2022-03-22 23:18:59 字數 2777 閱讀 8813

本文演算法使用python3實現

(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) $

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]:

continue

return floor[-1]

(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 $

class solution:

def jumpfloorii(self, number):

'''迭代法,儲存n次結果'''

floor =

for i in range(number+1):

if i in [0,1,2]:

continue

step = 0

for k in range(i):

step += floor[k]

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

我們可以用21的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?

時間限制:1s;空間限制:32768k

(1)當 $ n=0 $ 時,返回0

(2)當 $ n=1 $ 時,只有一種覆蓋方法,即豎著覆蓋。

(3)當 $ n=2 $ 時,有兩種覆蓋方法:使用兩個 $ 2\times1 $ 的小矩形,橫著覆蓋與豎著覆蓋。

(4)當 $ n=3 $ 時,我們只考慮最後一步的情況:(a)當最後一步只需覆蓋乙個 $ 2\times1 $ 的矩形時時, $ f(3)=f(3-1) $ ;(b)當最後一步需覆蓋乙個 $ 2\times2 $ 的矩形時, $ f(3)=f(3-2) $

(5)以此類推,當 $ n=n $ 時,只需考慮最後一步的情況即可:(a)當最後一步只需覆蓋乙個 $ 2\times1 $ 的矩形時, $ f(n)=f(n-1) $ ;(b)當最後一步需覆蓋乙個 $ 2\times2 $ 的矩形時, $ f(n)=f(n-2) $ ;

class solution:

def rectcover(self, number):

# 使用迭代法進行

if number == 0:

return 0

methods =

for i in range(1,number+1):

if i in [1,2]:

else:

return methods[-1]

劍指offer 跳台階

跳台階1 題目 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。思路 遞迴思想 可以理解為前面m步的情況加上最後一步的情況,前面m步理解為,m 1步加上最後一步的情況。最後一步分為2中情況,上1級和上2級。如下 class solution 跳台階2 題目 ...

劍指Offer 跳台階

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 解析 當青蛙到到n級時,有兩種跳法,一種是從n 1級跳1級,還有種是n 2跳2級 f n f n 1 f n 2 大家對這個公式是不是很熟悉,對,是斐波那契數列。所以這是一道動態規劃的問題。斐波那契數列,只能上...

劍指Offer 跳台階

author tom qian email tomqianmaple outlook.com github date 2017年8月10日 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。思路 首先窮舉一下到達最後一級台階的情況,分析最後到達是一步還是兩步。...