Description
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
一般上過算法課的同學看到此題能第一時間想到下列公式:
f(n) = f(n-1) + f(n-2)
公式的含義爲,爬n階樓梯的方式爲最後一步是跨一階還是兩階樓梯的方式數目和。
1.可用遞歸算法解決。但是遞歸的時間複雜度爲O(2^n),不理想。
2.用動態規劃。
如果n爲0,則return 0,如果n爲1,return 1,如果n爲2,return 2。
爬三階樓梯的方式爲:f(3) = f(2)+f(1)= 3
爬四階樓梯的方式爲: f(4) = f(3) + f(2) = 5
...
由上可以看出,爬n階樓梯只於它的前兩個數據有關,我們知道了n=1和n=2的數據,就能得出f(3),以次類推。
用變量將前兩個數據保存,用i++控制循環直到i=n時停止。
則用python編寫算法爲:
def climbStairs(self, n):
if n == 0:
return 0
if n == 1:
return 1
if n == 2:
return 2
a = 1
b = 2
temp = a + b
for i in range(3,n+1):
temp = a + b
a = b
b = temp
return temp
上面的a存的是倒數第二個數據,b存的是倒數第一個數據,用臨時變量temp表示現在的數據。
往後挪的時候,倒數第一個數據就變成了倒數第二個數據,則a = b;
原本的‘’現在的‘’數據變成了倒數第一個,則b = temp;
然後令temp = a + b,此時temp存的又是現在的數據了。
循環完成後返回temp。