可以用枚舉法和歸納法來解答。
創(chuàng)新互聯建站是一家以成都網站建設、網頁設計、品牌設計、軟件運維、成都網站營銷、小程序App開發(fā)等移動開發(fā)為一體互聯網公司。已累計為成都汽車玻璃修復等眾行業(yè)中小客戶提供優(yōu)質的互聯網建站和軟件開發(fā)服務。
一、枚舉法
11級臺階,如果每次跨2級,最多可跨5次。所以,可以分六種情況來考慮:
1、每次都只跨一級臺階,這樣的走法只有1種。
2、有一次跨二級臺階,其余每次都跨一級臺階,這樣的走法有10=種。
3、有兩次跨二級臺階,其余每次都跨一級臺階,這樣的走法有8+7+6+5+4+3+2+1=36種。
4、有三次跨二級臺階,其余每次都跨一級臺階,這樣的走法有(6+5++4+3+2+1)+(5+4++3+2+1)+(4+3+2+1)+(3+2+1)+(2+1)+1=56種。
5、有四次跨二級臺階,其余每次都跨一級臺階,這樣的走法有36種。(算式略)
6、有五次跨二級臺階,其余每次都跨一級臺階,這樣的走法有6種。
所以,一共有1+10+36+56+35+6=144=
假設你正在爬樓梯。需要 n?階你才能到達樓頂。每次你可以爬 1 或 2 個臺階。
注意:給定 n 是一個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。1 階 + 1 階 和 2 階
解題思路:
實現了兩種方法,但是第一種超出時間限制(?ì _ í?),因為遞歸的時候方法實際計算了兩次。兩種方法都使用了動態(tài)規(guī)劃思想,比如對于爬10階樓梯,我們最后一步爬上第10階只會有兩種情況,一種是從9階樓梯爬1個臺階,一種是從8階臺階爬2兩個臺階上來。所以10階臺階問題可以劃分為爬9階和8階兩個子問題,一直遞歸劃分到只剩2階(2種方法)和1階(一種方法)。
超出時間限制的代碼:
class Solution:
def climbStairs(self, n: int) - int:
if n=2:
if n==2:
可以看出來的是,該題可以用斐波那契數列解決。
樓梯一共有n層,每次只能走1層或者2層,而要走到最終的n層。不是從n-1或者就是n-2來的。
F(1) = 1
F(2) = 2
F(n) = F(n-1) + F(n-2) (n=3)
這是遞歸寫法,但是會導致棧溢出。在計算機中,函數的調用是通過棧進行實現的,如果遞歸調用的次數過多,就會導致棧溢出。
針對這種情況就要使用方法二,改成非遞歸函數。
將遞歸進行改寫,實現循環(huán)就不會導致棧溢出
def?fun():
i?=?0
n?=?7?*?i
while?((n?%?2?==?1)?and?(n?%?3?==?2)?and?(n?%?5?==?4)?and?(n?%?6?==?5))?==?0:
i?=?i?+?1
n?=?7?*?i
return?n
算出來是119