题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
分析:
假设n个阶梯的走法为f(n)个,因为每一步都有两个选择,选择爬一阶或两阶,故有f(n) = f(n-1) + f(n-2)。
代码:
代码一:直接递归(不能通过),因为有很多重复计算
class Solution:
memo = {1:1, 2:2}
def climbStairs(self, n):
def dfs(n):
if n < 3:
return n
else:
return dfs(n-1) + dfs(n-2)
return dfs(n)
代码二:使用备忘录递归,减少重复计算。
执行用时: 60 ms, 在Climbing Stairs的Python3提交中击败了7.32% 的用户
内存消耗: 6.4 MB, 在Climbing Stairs的Python3提交中击败了79.11% 的用户
class Solution:
memo = {1:1, 2:2}
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n in self.memo:
return self.memo[n]
else:
self.memo[n] = self.climbStairs(n-1) + self.climbStairs(n-2)
return self.memo[n]
代码三:使用动态规划,自底向上。
执行用时: 40 ms, 在Climbing Stairs的Python3提交中击败了99.86% 的用户
内存消耗: 6.4 MB, 在Climbing Stairs的Python3提交中击败了93.99% 的用户
class Solution:
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
cache = [1] * (n+1)
for i in range(2, (n+1)):
cache[i] = cache[i-1] + cache[i-2]
return cache[n]
复杂度:
一、直接递归。时间复杂度O(
n
2
n^2
n2),空间复杂度O(
n
n
n)。
二、使用备忘录递归。时间复杂度O(
n
n
n),空间复杂度O(
n
n
n)。
三、使用动态规划。时间复杂度O(
n
n
n),空间复杂度O(
n
n
n)。