1. 程式人生 > >leetcode 70-爬樓梯 python

leetcode 70-爬樓梯 python

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是一個正整數。

示例:

輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1.  1 階 + 1 階
2.  2 階
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1.  1 階 + 1 階 + 1 階
2.  1 階 + 2 階
3.  2 階 + 1 階

第一反應使用遞迴,遞迴就是呼叫函式本身,優點就是程式碼簡潔,但帶來的就是時間和空間消耗較大。每一次的函式調動都會在記憶體棧中分配空間儲存引數,返回地址以及臨時變數,而且往棧裡面壓入資料和彈出都需要時間。

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 1:
            return 1
        elif n == 2:
            return 2
        else:
            a = self.climbStairs(n-1)
            b = self.climbStairs(n-2)
            return a + b

​

​

提交的答案超出時間限制,就要考慮使用遞推的方法解決這個問題。不同於遞迴是自己呼叫自己,遞推並不是這樣;而且遞推不是將問題從複雜變為簡單,而是從簡單一步步先前發展,得到最終答案,是一個正向的過程;而且遞推並不需要知道這裡的n;最後,在可以計算的情況下遞推的效率是高於遞迴的。

下面這個程式碼用到了斐波那契數列的思想:想不到啊= =

class Solution:
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        num = [0, 1, 2]
        if n == 1:
            return num[1]
        if n == 2:
            return num[2]
        else:
            for i in range(3, n+1):
                num.append(num[i-1]+num[i-2])
            return num[n]