[LeetCode]Climbing Stairs

Climbing Stairs

题意:一共有n个台阶,每次只能走1或者2个台阶,求走到该台阶的路径个数。

动态规划

思路:当前走的路径个数取决于走一步和两步的个数,也就是之前走了一步的值(加下来走一步)和之前走了两步(接下来走两步)的值之和。

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 1:
            return 1
        if n == 2:
            return 2
        dp = [1] + [2] + [0] * (n-2)
        for i in range(2, n):
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n-1]

看了网上写的,发现方法很多,有自顶向下,自底向上,还有使用优化方法-记忆化,如下:

# Top down - TLE
def climbStairs1(self, n):
    if n == 1:
        return 1
    if n == 2:
        return 2
    return self.climbStairs(n-1)+self.climbStairs(n-2)
# Bottom up, O(n) space
def climbStairs2(self, n):
    if n == 1:
        return 1
    res = [0 for i in xrange(n)]
    res[0], res[1] = 1, 2
    for i in xrange(2, n):
        res[i] = res[i-1] + res[i-2]
    return res[-1]
# Bottom up, constant space
def climbStairs3(self, n):
    if n == 1:
        return 1
    a, b = 1, 2
    for i in xrange(2, n):
        tmp = b
        b = a+b
        a = tmp
    return b
# Top down + memorization (list)
def climbStairs4(self, n):
    if n == 1:
        return 1
    dic = [-1 for i in xrange(n)]
    dic[0], dic[1] = 1, 2
    return self.helper(n-1, dic)
def helper(self, n, dic):
    if dic[n] < 0:
        dic[n] = self.helper(n-1, dic)+self.helper(n-2, dic)
    return dic[n]
# Top down + memorization (dictionary)  
def __init__(self):
    self.dic = {1:1, 2:2}
def climbStairs(self, n):
    if n not in self.dic:
        self.dic[n] = self.climbStairs(n-1) + self.climbStairs(n-2)
    return self.dic[n]
posted @ 2017-08-29 13:56  banananana  阅读(123)  评论(0)    收藏  举报