leetcode 70-爬樓梯 python
阿新 • • 發佈:2018-12-19
假設你正在爬樓梯。需要 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]