LintCode111. Climbing Stairs 爬樓梯(動態規劃)

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章