LeetCode刷题笔记--070. 爬楼梯

题目描述:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶
    示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 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)。

你可能感兴趣的:(LeetCode)